ในกรณีของนิพจน์ฟังก์ชันที่ไม่ระบุชื่อฟังก์ชันจะไม่ระบุชื่อ - ตามตัวอักษรไม่มีชื่อ ตัวแปรที่คุณกำหนดให้มีชื่อ แต่ฟังก์ชันไม่มี (อัปเดต: นั่นเป็นความจริงผ่าน ES5 ณ ES2015 [aka ES6] โดยมากฟังก์ชันที่สร้างด้วยนิพจน์ที่ไม่ระบุตัวตนจะได้รับชื่อจริง [แต่ไม่ใช่ตัวระบุอัตโนมัติ] อ่านต่อ ... )
ชื่อมีประโยชน์ สามารถดูชื่อได้ในสแต็กเทรซโทรสแต็กรายการเบรกพอยต์ ฯลฯ ชื่อเป็นสิ่งที่ดี
(คุณเคยต้องระวังนิพจน์ฟังก์ชันที่มีชื่อใน IE เวอร์ชันเก่า [IE8 และต่ำกว่า] เนื่องจากพวกเขาสร้างอ็อบเจ็กต์ฟังก์ชันที่แยกจากกันโดยสิ้นเชิงโดยผิดพลาดในเวลาที่แตกต่างกันสองครั้ง [เพิ่มเติมในบทความบล็อกของฉันใช้เวลาสองเท่า ] หากคุณต้องการ สนับสนุน IE8 [!!] ควรใช้นิพจน์ฟังก์ชันแบบไม่ระบุตัวตนหรือการประกาศฟังก์ชันแต่หลีกเลี่ยงนิพจน์ฟังก์ชันที่ระบุชื่อ)
สิ่งสำคัญอย่างหนึ่งเกี่ยวกับนิพจน์ฟังก์ชันที่มีชื่อคือการสร้างตัวระบุในขอบเขตด้วยชื่อนั้นสำหรับฟังก์ชันภายใน functon body:
var x = function example() {
console.log(typeof example);
};
x();
console.log(typeof example);
ตั้งแต่ ES2015 นิพจน์ฟังก์ชัน "ไม่ระบุตัวตน" จำนวนมากจะสร้างฟังก์ชันที่มีชื่อและสิ่งนี้เกิดขึ้นก่อนหน้านี้โดยเอ็นจิ้น JavaScript สมัยใหม่ต่างๆที่ค่อนข้างฉลาดในการอนุมานชื่อจากบริบท ใน ES2015 boo
แสดงออกฟังก์ชั่นที่ไม่ระบุชื่อของคุณจะส่งผลในฟังก์ชั่นที่มีชื่อ อย่างไรก็ตามแม้จะมีความหมาย ES2015 + ตัวระบุอัตโนมัติจะไม่ถูกสร้างขึ้น:
var obj = {
x: function() {
console.log(typeof x);
console.log(obj.x.name);
},
y: function y() {
console.log(typeof y);
console.log(obj.y.name);
}
};
obj.x();
obj.y();
การกำหนดชื่อฟังก์ชันเสร็จสิ้นด้วยการดำเนินการนามธรรมSetFunctionName ที่ใช้ในการดำเนินการต่างๆในข้อมูลจำเพาะ
โดยทั่วไปแล้วเวอร์ชันสั้นนั้นจะปรากฏขึ้นเมื่อใดก็ตามที่นิพจน์ฟังก์ชันที่ไม่ระบุตัวตนปรากฏขึ้นทางด้านขวามือของบางสิ่งเช่นการกำหนดหรือการเริ่มต้นเช่น:
var boo = function() { };
(หรืออาจเป็นlet
หรือconst
มากกว่าvar
)หรือ
var obj = {
boo: function() { }
};
หรือ
doSomething({
boo: function() { }
});
(สองตัวสุดท้ายนี้เหมือนกันจริงๆ)ฟังก์ชันผลลัพธ์จะมีชื่อ ( boo
ในตัวอย่าง)
มีข้อยกเว้นที่สำคัญและโดยเจตนา: การกำหนดให้กับคุณสมบัติบนวัตถุที่มีอยู่:
obj.boo = function() { };
นี่เป็นเพราะความกังวลเกี่ยวกับการรั่วไหลของข้อมูลที่เกิดขึ้นเมื่อคุณลักษณะใหม่กำลังอยู่ในขั้นตอนการเพิ่ม รายละเอียดในคำตอบของฉันคำถามอื่นที่นี่