El problema de rendimiento aquí es el costo de crear un nuevo objeto de función en cada iteración del ciclo y no el hecho de que use una función anónima:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Está creando mil objetos de función distintos a pesar de que tienen el mismo cuerpo de código y no se vinculan al ámbito léxico ( cierre ). Lo siguiente parece más rápido, por otro lado, porque simplemente asigna la misma referencia de función a los elementos de la matriz en todo el ciclo:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Si tuviera que crear la función anónima antes de ingresar al bucle, entonces solo asigne referencias a los elementos de la matriz mientras está dentro del bucle, encontrará que no hay diferencia de rendimiento o semántica en comparación con la versión de la función nombrada:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
En resumen, no hay un costo de rendimiento observable al usar funciones anónimas sobre funciones nombradas.
Como acotación al margen, puede parecer desde arriba que no hay diferencia entre:
function myEventHandler() { }
y:
var myEventHandler = function() { }
La primera es una declaración de función, mientras que la última es una asignación variable a una función anónima. Aunque parezca que tienen el mismo efecto, JavaScript los trata de manera ligeramente diferente. Para comprender la diferencia, recomiendo leer, " Ambigüedad de declaración de función de JavaScript ".
El tiempo de ejecución real de cualquier enfoque dependerá en gran medida de la implementación del compilador y el tiempo de ejecución del navegador. Para obtener una comparación completa del rendimiento del navegador moderno, visite el sitio JS Perf