หยิบเอาเทคนิคเล็กๆน้อยๆมาเล่าให้ฟังถึงแม้จะเป็นเรื่องเก่าแล้วก็ตามนะครับ (แหม ก็ actionscript 2.0 นี่นา ) แต่ผมเชื่อว่ายังมีคนใช้ประโยชน์จากมันได้แน่
คิดว่าทุกคนคงจะคุ้นเคยกับการสร้าง Event ใช้งานใน ActionScript 2.0 ในรูปแบบ โค้ดต่อไปนี้
MC.onRelease = function(){ trace( this ); }
จากโค้ดด้านบน เราจะรู้ดีว่าการสั่งงาน this ในฟังชั่นนั้น จะหมายถึงตัว MC เอง
การ trace ก็จะแสดงถึง path ของ MC ออกมา
แน่นอน ในกรณีนี้ เราใช้กันบ่อยๆ ผมจะขอสรุปว่า เรากำหนดให้ function ที่ไม่มีชื่อนั้น ทำงานเป็น Event handler ของเหตุการณ์ onRelease ของ MC
ซึ่งในลักษณะนี้ เราสามารถเรียก MC ว่าเป็น Function Context คำว่า Function Context นั้นจะให้เปรียบเทียบ ก็ให้ดูจากการใช้งาน this ภายในฟังชั่นนั้น this จะเป็นเหมือน “เจ้าของฟังชั่น” เพราะถ้าเราสั่ง this จะเปรียบเสมือน เรียกใช้งานวัตถุนั้นๆ ที่เป็น Function Context นั้นเอง
คราวนี้เมื่อเรารู้จัก Function Context กันแล้ว ในบางกรณี เรามีฟังชั่น ซึ่งเป็นฟังชั่นที่ไม่ได้กำหนด “เจ้าของ” หรือก็คือไม่ได้กำหนด Function Context มาก่อน เช่น
function doSomething(){ trace(this); } doSomeThing();
หากใครได้เขียนบ่อยๆ ก็จะอ๋อทันทีว่า เมื่อเราใช้งาน ฟังชั่น และมีการเรียก this ภายในฟังชั่น เราจะพบว่า trace ค่าได้ undefined
ถึงแม้ฟังชั่นนั้น จะเขียนอยู่บน _root ก็ตาม หลายคนอาจจะคิดว่า มันเขียนอยุ่บน _root ดังนั้นมันน่าจะแสดง _root สิ
แต่ในความเป็นจริงแล้ว การทำงาน this ในฟังชั่น จะเป็นการ พยายามอ้างถึง Function Context นั่นเอง
ซึ่งในบางกรณีแล้ว เราอยากจะให้ฟังชั่นนั้น สามารถทำงานกับวัตถุอื่นๆเช่นกัน ยกตัวอย่างเช่น
เราเขียนฟังชั่นที่ทำงานอนิเมชั่นที่สวยหรูได้มาหนึ่งฟังชั่น เราอยากให้ฟังชั่นนี้ทำงานกับ MovieClip ตัวใดก็ได้
หมายความว่า เราอยากให้ฟังชั่นเดียว แต่สามารถมี Functuion Context เป็นวัตถุที่เราต้องการได้ทันที
(*แน่นอน ความต้องการนี้สามารถทำได้ด้วยการ Prototype หรือวิธีอื่นก็ได้ แต่ความสะดวกก็ต่างกรณีกัน แล้วแต่งานนั้นๆ)
จริงๆแล้วเราไม่ต้องปรับเปลี่ยนฟังชั่นนั้นเลย แค่เพียงเปลี่ยนวิธีเรียกเท่านั้น
ร่ายมาซะยาว เพื่อที่จะอธิบายสั้นๆว่า
ฟังชั่นทุกฟังชั่นนั้น ได้สืบทอดมาจากคลาส Function ซึ่งคลาสฟังชั่นมี Methode ที่ชื่อว่า call อยู่ ซึ่ง Methode นี้เอง
เป็นสิ่งที่เราจะใช้กันในงานลักษณะนี้
เราสามารถใช้ Methode Call กับฟังชั่นด้านบนด้วยโค้ดต่อไปนี้
function doSomething(){ trace(this); } doSomeThing.call( MC );
โค้ดที่ง่ายมาก
เมื่อเราใช้งาน Methode call ตามด้านบนแล้วผลก็คือ MC จะกลายเป็น Function Context ของฟังชั่นนั้นทันที
และการเรียกใช้งาน this ก็จะเป็นการเรียกใช้งาน MC นั่นเอง
การแต่งตั้ง “เจ้าของฟังชั่น” จึงจบด้วยประการฉะนี้
อ้อ ขอเพิ่มเติม สำหรับฟังชั่นที่มีการ ส่งค่า parameter เข้าไป ก็ยังสามารถใช้เทคนิคนี้ได้เช่นกัน ดังโค้ดด้านล่าง
function doSomething( v1 , v2 , v3){ trace(this); trace(v1+v2+v3); } doSomeThing.call( MC , "a" , "b" , "c");
แค่นี้เอง
