Vấn đề về hiệu suất ở đây là chi phí tạo một đối tượng hàm mới ở mỗi lần lặp lại của vòng lặp chứ không phải việc bạn sử dụng một hàm ẩn danh:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Bạn đang tạo một nghìn đối tượng hàm riêng biệt mặc dù chúng có cùng nội dung mã và không có ràng buộc với phạm vi từ vựng ( đóng ). Mặt khác, cách sau có vẻ nhanh hơn vì nó chỉ đơn giản gán cùng một tham chiếu hàm cho các phần tử mảng trong suốt vòng lặp:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Nếu bạn đã tạo hàm ẩn danh trước khi vào vòng lặp, sau đó chỉ gán các tham chiếu đến nó cho các phần tử mảng trong khi bên trong vòng lặp, bạn sẽ thấy rằng không có sự khác biệt về hiệu suất hoặc ngữ nghĩa khi so sánh với phiên bản hàm được đặt tên:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Nói tóm lại, không có chi phí hiệu suất có thể quan sát được khi sử dụng các hàm ẩn danh được đặt tên.
Ngoài ra, có thể nhìn từ trên xuống rằng không có sự khác biệt giữa:
function myEventHandler() { }
và:
var myEventHandler = function() { }
Cái trước là một khai báo hàm trong khi cái sau là một phép gán biến cho một hàm ẩn danh. Mặc dù chúng có thể có cùng tác dụng, nhưng JavaScript xử lý chúng hơi khác một chút. Để hiểu sự khác biệt, tôi khuyên bạn nên đọc “Sự mơ hồ về khai báo hàm JavaScript ”.
Thời gian thực thi thực tế cho bất kỳ cách 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. Để có so sánh đầy đủ về hiệu suất của trình duyệt hiện đại, hãy truy cập trang web JS Perf