Il problema delle prestazioni qui è il costo della creazione di un nuovo oggetto funzione ad ogni iterazione del ciclo e non il fatto che si utilizza una funzione anonima:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Stai creando un migliaio di oggetti funzione distinti anche se hanno lo stesso corpo di codice e nessun legame con l'ambito lessicale ( chiusura ). Quanto segue sembra più veloce, d'altra parte, perché assegna semplicemente lo stesso riferimento di funzione agli elementi dell'array durante il ciclo:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Se dovessi creare la funzione anonima prima di entrare nel ciclo, quindi assegnare solo riferimenti ad essa agli elementi dell'array mentre sei all'interno del ciclo, scoprirai che non ci sono prestazioni o differenze semantiche di sorta rispetto alla versione della funzione denominata:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
In breve, non vi è alcun costo di prestazioni osservabile nell'utilizzo di funzioni anonime rispetto a quelle denominate.
Per inciso, può sembrare dall'alto che non ci sia differenza tra:
function myEventHandler() { }
e:
var myEventHandler = function() { }
La prima è una dichiarazione di funzione mentre la seconda è un'assegnazione di variabile a una funzione anonima. Sebbene possano sembrare che abbiano lo stesso effetto, JavaScript li tratta in modo leggermente diverso. Per capire la differenza, consiglio di leggere " Ambiguità della dichiarazione della funzione JavaScript ".
Il tempo di esecuzione effettivo per qualsiasi approccio sarà in gran parte dettato dall'implementazione del compilatore e del runtime da parte del browser. Per un confronto completo delle prestazioni dei browser moderni, visitare il sito JS Perf