Vấn đề hiệu suất ở đây là chi phí của việc tạo ra một đối tượng hàm mới tại mỗi lần lặp của vòng lặp và không phải là thực tế rằng bạn sử dụng một ẩn danh chức năng:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
Bạn đang tạo một nghìn đối tượng chức năng riêng biệt mặc dù chúng có cùng một phần mã và không ràng buộc với phạm vi từ vựng ()). Sau đây dường như nhanh hơn, mặt khác, bởi vì nó chỉ đơn giản là gán các cùng tham khảo chức năng để các phần tử mảng trong suốt vòng lặp:
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Nếu bạn đã tạo ra các chức năng ẩn danh trước khi vào vòng lặp, sau đó chỉ gán tham chiếu đến nó vào phần tử mảng trong khi bên trong vòng lặp, bạn sẽ thấy rằng không có hiệu suất hoặc ngữ nghĩa khác biệt nào khi so sánh với phiên bản hàm có tên:
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Nói tóm lại, không có chi phí thực hiện quan sát để sử dụng các hàm ẩn danh có tên.
Là một sang một bên, nó có thể xuất hiện từ trên cao mà không có sự khác biệt giữa:
function myEventHandler() { /* ... */ }
và:
var myEventHandler = function() { /* ... */ }
Điều thứ nhất là một tuyên bố chức năng trong khi sau này là một biến gán cho một hàm ẩn danh. Mặc dù chúng có vẻ có cùng tác dụng, nhưng JavaScript lại xử lý chúng một cách hơi khác nhau. Để hiểu sự khác biệt, tôi khuyên bạn nên đọc “JavaScript function declaration ambiguity”.
Thời gian thực thi thực tế cho bất kỳ phương pháp tiếp cận nào phần lớn sẽ được quyết định bởi việc triển khai trình biên dịch và thời gian chạy của trình duyệt. Để so sánh hoàn toàn hiệu suất trình duyệt hiện đại, hãy truy cập vào the JS Perf site
Tôi biết nó không có trong câu hỏi, nhưng liên quan đến code-cleanliness/legibility Tôi nghĩ rằng 'đúng cách' là một nơi nào đó ở giữa. "Sự lộn xộn" của các hàm mức cao nhất hiếm khi được sử dụng là gây phiền nhiễu, nhưng vì vậy mã lồng nhau phụ thuộc rất nhiều vào các hàm ẩn danh được khai báo trong dòng với lời gọi của chúng (xem địa chỉ gọi lại node.js). Cả hai trước đây và sau này có thể thực hiện gỡ lỗi/thực hiện truy tìm khó khăn. –
Các thử nghiệm hiệu suất dưới đây chạy hàm cho hàng nghìn lần lặp. Ngay cả khi bạn thấy sự khác biệt đáng kể, phần lớn các trường hợp sử dụng sẽ không làm điều này trong các lần lặp lại của thứ tự đó. Do đó tốt hơn nên chọn bất cứ điều gì phù hợp với nhu cầu của bạn và bỏ qua hiệu suất cho trường hợp cụ thể này. – Medorator
@nickf tất nhiên là câu hỏi quá cũ của nó, nhưng hãy xem câu trả lời cập nhật mới –