Das Leistungsproblem hierbei sind die Kosten für die Erstellung eines neuen Funktionsobjekts bei jeder Iteration der Schleife und nicht die Tatsache, dass Sie eine anonyme Funktion verwenden:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
Sie erstellen tausend verschiedene Funktionsobjekte, obwohl sie denselben Code enthalten und nicht an den lexikalischen Bereich gebunden sind ( Abschluss ). Das Folgende scheint andererseits schneller zu sein, da es den Array-Elementen in der gesamten Schleife einfach dieselbe Funktionsreferenz zuweist :
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Wenn Sie die anonyme Funktion vor dem Betreten der Schleife erstellen und dann nur innerhalb der Schleife Verweise auf die Array-Elemente zuweisen, werden Sie feststellen, dass es im Vergleich zur benannten Funktionsversion keinerlei Leistung oder semantischen Unterschied gibt:
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Kurz gesagt, es gibt keine beobachtbaren Leistungskosten für die Verwendung anonymer überbenannter Funktionen.
Abgesehen davon kann es von oben erscheinen, dass es keinen Unterschied gibt zwischen:
function myEventHandler() { /* ... */ }
und:
var myEventHandler = function() { /* ... */ }
Ersteres ist eine Funktionsdeklaration, während letzteres eine variable Zuordnung zu einer anonymen Funktion ist. Obwohl sie den gleichen Effekt zu haben scheinen, behandelt JavaScript sie etwas anders. Um den Unterschied zu verstehen, empfehle ich, „ Mehrdeutigkeit der JavaScript-Funktionsdeklaration “ zu lesen .
Die tatsächliche Ausführungszeit für jeden Ansatz wird weitgehend von der Implementierung des Compilers und der Laufzeit durch den Browser bestimmt. Einen vollständigen Vergleich der modernen Browserleistung finden Sie auf der JS Perf-Website