วัตถุ Function ECMAScript (class)
- หน้าก่อนหน้า วัตถุ arguments
- หน้าต่อไป การปิดหน้าปิด (closure)
ฟังก์ชันของ ECMAScript มีความสามารถทั้งหมดในฐานะ Object
Object ฟังก์ชัน (คลาส)
ECMAScript ที่น่าสนใจที่สุดอาจจะเป็นการที่ฟังก์ชันเป็นอ็อบเจกที่มีความสามารถทั้งหมด
Function คลาสสามารถแสดงถึงฟังก์ชันที่ผู้พัฒนากำหนดไว้
การสร้างฟังก์ชันโดยใช้ Function คลาสมีรูปแบบต่อไปนี้:
var function_name = new function(arg1, arg2, ... , argN, function_body)
ในรูปแบบดังนี้ แต่ละ arg มีตัวแปรหนึ่ง และตัวแปรสุดท้ายเป็นรหัสการทำงานของฟังก์ชัน (รหัสที่ต้องการทำงาน)
จำได้ฟังก์ชันนี้ไหม?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
ยังสามารถกำหนดมันด้วยรูปแบบดังนี้:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
ถึงแม้ว่ามีปัญหาเกี่ยวกับตัวอักษรตัวเดียวกัน มันก็เป็นการเขียนที่บกพร่อง แต่มันช่วยให้เข้าใจว่าฟังก์ชันเป็นชนิดของอาทิตย์อุดม และการปฏิบัติของมันเหมือนกับฟังก์ชันที่สร้างด้วย Function ชนิด
โปรดดูตัวอย่างด้านล่างนี้:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //แสดง "20"
เช่นเดียวกับที่คุณทราบ ฟังก์ชันที่สองเกี่ยวโยงกับฟังก์ชันที่หนึ่ง ทำให้ doAdd(10) แสดง "20" แทนที่ "30"
หากเปลี่ยนรหัสบล็อคนี้เป็นรูปแบบดังนี้ ความหมายนี้จะเป็นชัดเจนขึ้น:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
โปรดจับตาดูรหัสนี้ ชัดเจนว่าค่า doAdd ถูกเปลี่ยนเป็นตัวแทนที่หนุ่มที่หนุ่มไปยังวัตถุที่ต่างกัน ฟังก์ชันนามที่เป็นตัวแทนที่หนุ่มเป็นอาทิตย์อุดมที่หนุ่มเหมือนวัตถุอื่น และแม้กระทั่งทำให้สองตัวแปรหนุ่มที่หนุ่มไปยังฟังก์ชันเดียวกัน:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //แสดง "20" alsodoAdd(10); //แสดง "20"
ในที่นี้ ตัวแปร doAdd ถูกกำหนดเป็นฟังก์ชัน และ alsodoAdd ถูกประกาศเป็นตัวแทนที่หนุ่มที่หนุ่มไปยังฟังก์ชันเดียวกัน ด้วยทั้งสองตัวแปรนี้ คุณสามารถปฏิบัติภาพรหัสการทำงานของฟังก์ชันและแสดงผลที่เหมือนกัน - "20" ดังนั้น ถ้าชื่อฟังก์ชันเป็นตัวแทนที่หนุ่มที่หนุ่มไปยังฟังก์ชัน คุณสามารถส่งฟังก์ชันเข้าไปในฟังก์ชันอื่นได้ไหม? ตอบคำถามคือใช่!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); // ออก "20"
ในตัวอย่างข้างต้น callAnotherFunc() มีตัวเลือกสอง - ฟังก์ชันที่ต้องการเรียกและตัวเลือกที่จะส่งผ่านไปยังฟังก์ชัน รหัสนี้ส่ง doAdd() ไปยังฟังก์ชัน callAnotherFunc() และตัวเลือก 10 ออก "20"
แจ้งเตือน:ถึงแม้จะสามารถใช้ฟังก์ชัน Function ที่สร้างฟังก์ชันได้ แต่ไม่ควรใช้มันเพราะมันเร็วกว่าวิธีที่แบบเก่ามากกว่า อย่างไรก็ตาม ทุกฟังก์ชันต้องถือว่าเป็นตัวอย่างของ Class Function
ตัวแปร length ของวัตถุ Function
เช่นเดียวกับที่กล่าวข้างต้น ฟังก์ชันเป็นชนิดของประเภท reference ดังนั้น มันมีตัวแปรและวิธีของมันเช่นกัน
การกำหนดตัวแปร length ของ ECMAScript ระบุจำนวนตัวเลือกที่ฟังก์ชันคาดหวังว่าจะได้รับ ตัวอย่างเช่น:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); // ออก "1" alert(sayHi.length); // ออก "0"
ฟังก์ชัน doAdd() มีตัวเลือกหนึ่ง ดังนั้น length ของมันคือ 1 ฟังก์ชัน sayHi() ไม่มีตัวเลือก ดังนั้น length ของมันคือ 0
จำเป็นต้องจดจำว่า ไม่ว่าจะมีอะไรตัวเลือกหรือไม่ ECMAScript สามารถรับอะไรตัวเลือกหลายตัว (สูงสุด 25 ตัว) นี้ได้ถูกอธิบายในบทความ "รายละเอียดฟังก์ชัน" นี้ ขอบคุณ
วิธีของวัตถุ Function
วัตถุ Function มีวิธี valueOf() และ toString() ที่แชร์กับทุกวัตถุ ทั้งสองวิธีนี้จะกลับค่าเป็นรหัสแหล่งของฟังก์ชัน ซึ่งมีประโยชน์มากในระหว่างการทดสอบ ตัวอย่างเช่น:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
บรรทัดรหัสข้างต้นได้สร้างข้อความของฟังก์ชัน doAdd()ทดลองด้วยตัวเอง!
- หน้าก่อนหน้า วัตถุ arguments
- หน้าต่อไป การปิดหน้าปิด (closure)