ปัญหาด้านประสิทธิภาพที่นี่คือต้นทุนในการสร้างอ็อบเจ็กต์ฟังก์ชันใหม่ในการวนซ้ำแต่ละครั้งไม่ใช่ข้อเท็จจริงที่ว่าคุณใช้ฟังก์ชันที่ไม่ระบุชื่อ:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
คุณกำลังสร้างอ็อบเจ็กต์ฟังก์ชันที่แตกต่างกันนับพันแม้ว่าจะมีเนื้อหาของโค้ดที่เหมือนกันและไม่มีการผูกมัดกับขอบเขตคำศัพท์ ( การปิด ) สิ่งต่อไปนี้ดูเหมือนจะเร็วกว่าในทางกลับกันเพราะเพียงกำหนดการอ้างอิงฟังก์ชันเดียวกันให้กับองค์ประกอบอาร์เรย์ตลอดทั้งวง:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
หากคุณต้องสร้างฟังก์ชันที่ไม่ระบุตัวตนก่อนเข้าสู่ลูปให้กำหนดเฉพาะการอ้างอิงไปยังองค์ประกอบอาร์เรย์ในขณะที่อยู่ในลูปคุณจะพบว่าไม่มีความแตกต่างของประสิทธิภาพหรือความหมายใด ๆ เมื่อเทียบกับเวอร์ชันของฟังก์ชันที่มีชื่อ:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
กล่าวโดยย่อคือไม่มีต้นทุนประสิทธิภาพที่สังเกตได้สำหรับการใช้ฟังก์ชันที่ไม่ระบุชื่อ
นอกจากนี้อาจดูเหมือนจากด้านบนว่าไม่มีความแตกต่างระหว่าง:
function myEventHandler() { }
และ:
var myEventHandler = function() { }
อดีตคือการประกาศฟังก์ชันในขณะที่แบบหลังเป็นการกำหนดตัวแปรให้กับฟังก์ชันที่ไม่ระบุตัวตน แม้ว่าอาจดูเหมือนว่าจะมีผลเหมือนกัน แต่ JavaScript ก็ปฏิบัติแตกต่างกันเล็กน้อย เพื่อให้เข้าใจถึงความแตกต่างขอแนะนำให้อ่าน“ ความไม่ชัดเจนของการประกาศฟังก์ชัน JavaScript "
เวลาดำเนินการจริงสำหรับแนวทางใด ๆ ส่วนใหญ่จะถูกกำหนดโดยการใช้งานคอมไพเลอร์และรันไทม์ของเบราว์เซอร์ หากต้องการเปรียบเทียบประสิทธิภาพของเบราว์เซอร์สมัยใหม่ทั้งหมดโปรดไปที่เว็บไซต์ JS Perf