Hàm ẩn danh (anonymous functions) có thể ảnh hưởng hiệu năng trong một số tình huống, nhưng thường không đáng kể trong ứng dụng thực tế. Hiểu trade-off giúp viết code tốt hơn.
Điểm cần lưu ý
- Tạo object hàm mới mỗi lần chạy: Nếu định nghĩa hàm ẩn danh trong vòng lặp hoặc hàm cha được gọi nhiều lần, mỗi lần tạo một function object mới → tăng GC pressure.
- Không thể tái sử dụng: Không tham chiếu được để gỡ event listener (
removeEventListenercần cùng tham chiếu). - Debug khó khăn: Stack trace hiển thị "(anonymous)" thay vì tên hàm có ý nghĩa.
- Closure vô tình: Có thể giữ tham chiếu đến biến ngoài không cần thiết, gây memory leak.
Ví dụ hàm ẩn danh
// Gán vào biến
var func = function() {
alert('Đây là hàm ẩn danh');
};
func(); // Gọi qua biến
// Dùng làm callback
setTimeout(function() {
console.log('Chạy sau 1 giây');
}, 1000);
Khuyến nghị
- Dùng hàm có tên (named function) cho event handler, callback phức tạp, hoặc cần tái sử dụng.
- Arrow function (
() => {}) cũng là anonymous – cùng vấn đề. - Tối ưu hóa: định nghĩa hàm ngoài vòng lặp, dùng
bindhoặc closure cẩn thận. - Hiện đại: Engine JS (V8, SpiderMonkey) tối ưu rất tốt, hiệu năng chỉ thành vấn đề ở hot path cực đoan.