Le problème de performances ici est le coût de création d'un nouvel objet fonction à chaque itération de la boucle et non le fait que vous utilisez une fonction anonyme:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
};
}
Vous créez un millier d'objets de fonction distincts même s'ils ont le même corps de code et aucune liaison avec la portée lexicale ( fermeture ). Ce qui suit semble plus rapide, en revanche, car il affecte simplement la même référence de fonction aux éléments du tableau tout au long de la boucle:
function myEventHandler() {
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Si vous deviez créer la fonction anonyme avant d'entrer dans la boucle, puis attribuez-lui des références uniquement aux éléments du tableau à l'intérieur de la boucle, vous constaterez qu'il n'y a aucune différence de performance ou de sémantique par rapport à la version de la fonction nommée:
var handler = function() {
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
En bref, il n'y a aucun coût de performance observable à l'utilisation de fonctions anonymes sur des fonctions nommées.
En passant, il peut sembler d'en haut qu'il n'y a pas de différence entre:
function myEventHandler() { }
et:
var myEventHandler = function() { }
Le premier est une déclaration de fonction tandis que le second est une affectation de variable à une fonction anonyme. Bien qu'ils semblent avoir le même effet, JavaScript les traite légèrement différemment. Pour comprendre la différence, je vous recommande de lire « ambiguïté de déclaration de fonction JavaScript ».
Le temps d'exécution réel de toute approche sera en grande partie dicté par l'implémentation du compilateur et du runtime par le navigateur. Pour une comparaison complète des performances des navigateurs modernes, visitez le site JS Perf