Problem z wydajnością jest tutaj kosztem tworzenia nowego obiektu funkcji przy każdej iteracji pętli, a nie faktem, że używasz funkcji anonimowej:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Tworzysz tysiąc różnych obiektów funkcji, mimo że mają ten sam kod i nie mają powiązania z zakresem leksykalnym ( zamknięcie ). Z drugiej strony, poniższe wydaje się szybsze, ponieważ po prostu przypisuje to samo odwołanie do funkcji do elementów tablicy w całej pętli:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Jeśli miałbyś utworzyć anonimową funkcję przed wejściem do pętli, a następnie przypisać do niej odwołania do elementów tablicy tylko wewnątrz pętli, zauważysz, że nie ma żadnej różnicy wydajności lub semantycznej w porównaniu z wersją funkcji o nazwie:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
Krótko mówiąc, korzystanie z funkcji anonimowych zamiast nazwanych nie wiąże się z żadnymi zauważalnymi kosztami wydajności.
Nawiasem mówiąc, z góry może się wydawać, że nie ma różnicy między:
function myEventHandler() { }
i:
var myEventHandler = function() { }
Pierwsza jest deklaracją funkcji, podczas gdy druga jest przypisaniem zmiennej do funkcji anonimowej. Chociaż może się wydawać, że mają ten sam efekt, JavaScript traktuje je nieco inaczej. Aby zrozumieć różnicę, polecam przeczytanie „ Niejednoznaczności deklaracji funkcji JavaScript ”.
Rzeczywisty czas wykonania dowolnego podejścia będzie w dużej mierze podyktowany implementacją kompilatora i środowiska wykonawczego w przeglądarce. Aby uzyskać pełne porównanie wydajności współczesnych przeglądarek, odwiedź witrynę JS Perf