function doSomething() {
return function() {
s2._x = 0;
}
}
s1.onRelease = doSomething();
คิดซะว่าฟังชั่น คือวัตถุ 1 วัตถุ
ชื่อฟังชั่น(); <---- มีวงเล็บ จะหมายถึง สั่งทำงานฟังชั่นนั้น ทันที โดยจะส่งค่าเข้าไปในฟังชั่น ในวงเล็บ หรือปล่อยว่างไว้ก้ได้
ชื่อฟังชั่น <-----ไม่มีวงเล็บ จะหมายถึง อ้างถึงวัตถุที่เป็นฟังชั่น นั้นๆุนั้น
เหมือนกับ
remote(); <--- เป็นการใช้งาน คือกดที่ปุ่มของรีโมท โดยถายในวงเล้บอาจจะส่งค่าเป็นปุ่มที่กด เช่นปุ่มเลข 3 จากนั้นในฟังชั่นจึงทำการเปิดช่อง 3
remote; <------ ไม่ได้เป็นการใช้งาน แต่เป็นการชี้ไปที่ ตัวรีโมท ว่า รีโมทตัวไหน
เช่น
a = remote;
ให้ a ชี้ไปที่ตัว รีโมท ดังนั้น
remote();
a();
สองคำสั่งนี้จะมีค่าเท่ากัน เพราะสั่ง a ทำงาน a ชี้ไปที่รีโมท รีโมทก็ทำงาน
==================================================
ถ้าปุ่มกดชื่อ s1
s1.onRelease = remote();
จะ้เป็นการ สั่งให้ onRelease = ทำงานโดยกดรีโมททันที โดยเมื่อทำงานแล้ว รีโมทจะรีเทิร์นค่ากลับมาว่า "ช่อง 3 นะ"
แล้วจึงตีความได้ว่า
s1.onRelease = "ช่อง 3 นะ";
onRelease ของปุ่มนี้ทำงานใดๆไม่ได้เลย onRelease มันไม่ได้สั่งให้ทำงานเลยสักนิด แต่มันตรงกับค่าที่ฟังชั่นส่งมา
=================================
ถ้า
s1.onRelease =
function() {
remote();
}
ภายในบล็อกสีแดง คือวัตถุหนึ่ง ทำงานโดย เรียกใช้วัตถุ remote
แบบนี้ก็ถูกใช้บ่อย และใช้ได้ดี
===============================
function remote(){
retuen "ช่อง 3 นะ";
}
s1.onRelease = remote;
แบบนี้ก็ถูกต้อง เพราะว่า onRelease ชี้ไปที่ วัตถุ รีโมท เมื่อ onRelease จึงสั่งงานรีโมท
========================
ย้อนกลับไปที่
function doSomething() {
return function() {
s2._x = 0;
}
}
s1.onRelease = doSomething();
s1.onRelease = doSomething();
<--เป็นการใช้งานฟังชั่นทันที ไม่ได้ชี้ไปที่ฟังชั่นนั้น ก็จริงแต่ว่าfunction doSomething() {
return function() {
<-----ฟังชั่นนี้ เมื่อทำงานแล้วก็รีเทิร์นค่ากลับไปเป็นวัตถุนี้ เมื่อ onRelease จึงทำงานที่วัตถุนี้ s2._x = 0;
}
}
===============================
ถึงแม้แบบนี้ก็เขียนได้ แต่ถ้าจะให้ดี แบบนี้ สั้น และ ง่าย กว่าไหม
function doSomething() {
s2._x = 0;
}
s1.onRelease = doSomething;