El problema de rendimiento aquí es el costo de crear un nuevo objeto de función en cada iteración del bucle y no el hecho de que utiliza un anónimo función:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
Usted está creando una función distinta mil objetos a pesar de que tienen el mismo cuerpo de código y no vinculante para el ámbito léxico (closure). El siguiente parece más rápido, por otro lado, porque simplemente asigna el misma referencia función a los elementos de la matriz a lo largo del bucle:
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Si se va a crear la función anónima antes de entrar en el bucle, entonces sólo asignar referencias a ella a los elementos de la matriz, mientras que dentro del bucle, se dará cuenta de que no hay rendimiento o diferencia semántica en absoluto cuando se compara con la versión función llamada:
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
En resumen, no hay costo de rendimiento observable usando funciones anónimas sobre nombradas.
Como un aparte, puede aparecer desde arriba que no hay diferencia entre:
function myEventHandler() { /* ... */ }
y:
var myEventHandler = function() { /* ... */ }
El primero es una declaración función mientras que el último es una variable asignación a una función anónima. Aunque parezcan tener el mismo efecto, JavaScript los trata de forma ligeramente diferente. Para entender la diferencia, recomiendo leer, "JavaScript function declaration ambiguity".
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 una comparación completa del rendimiento moderno del navegador, visite the JS Perf site
Sé que no está en la pregunta, pero en lo que respecta a la limpieza/legibilidad del código, creo que el "camino correcto" está en el medio. El "desorden" de las funciones de alto nivel que se usan raramente es molesto, pero también lo es el código fuertemente anidado que depende mucho de las funciones anónimas que se declaran en línea con su invocación (pensemos en node.js callback hell). Tanto el primero como el último pueden dificultar el seguimiento de la depuración/ejecución. –
Las pruebas de rendimiento a continuación ejecutan la función para miles de iteraciones. Incluso si ve una diferencia sustancial, la mayoría de los casos de uso no lo harán en iteraciones de ese orden. Por lo tanto, es mejor elegir lo que se adapte a sus necesidades e ignorar el rendimiento para este caso particular. – Medorator
@nickf, por supuesto, es una pregunta demasiado antigua, pero vea la nueva respuesta actualizada –