Проблема производительности здесь заключается в стоимости создания нового функционального объекта на каждой итерации цикла, а не факте использования анонимной функции:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
Вы создаете тысячу различных функциональных объектов, даже если они имеют одинаковое тело кода и не привязаны к лексической области ( closure ). С другой стороны, следующее кажется более быстрым, поскольку просто присваивает такую же ссылку на функцию элементам массива в цикле:
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Если вы создадите анонимную функцию перед входом в цикл, а затем присвойте ссылки на нее только элементам массива, находящимся внутри цикла, вы обнаружите, что нет никакой производительности или семантической разницы по сравнению с версией названной функции :
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Короче говоря, нет никакой заметной потери производительности при использовании анонимных над именованными функциями.
Кроме того, сверху может показаться, что нет разницы между:
function myEventHandler() { /* ... */ }
и
var myEventHandler = function() { /* ... */ }
Первое - это объявление функции , а второе - присвоение переменной анонимной функции. Хотя они могут показаться одинаковыми, JavaScript обрабатывает их немного по-разному. Чтобы понять разницу, я рекомендую прочесть « Неопределенность объявления функций JavaScript ».
Фактическое время выполнения для любого подхода во многом будет зависеть от реализации браузером компилятора и времени выполнения. Для полного сравнения производительности современных браузеров посетите сайт JS Perf