วัตถุ Function ECMAScript (class)

ฟังก์ชันของ 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()ทดลองด้วยตัวเอง