Проблема с производительностью здесь заключается в стоимости создания нового объекта функции на каждой итерации цикла, а не в том, что вы используете анонимную функцию:
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.