Проблема продуктивності тут полягає у вартості створення нового об’єкта функції на кожній ітерації циклу, а не в тому, що ви використовуєте анонімну функцію:
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