Le problème de performance ici est le coût de la 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() {
// do something
};
}
Vous créez un millier d'objets fonctionnels distincts même s'ils ont le même corps de code et aucune liaison avec la portée lexicale ( fermeture ). En revanche, la méthode suivante semble plus rapide, car elle affecte simplement l'élément même aux éléments du tableau tout au long de la boucle :
function myEventHandler() {
// do something
}
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = myEventHandler;
}
Si vous créez la fonction anonyme avant d'entrer dans la boucle, puis que vous n'affectez les références à cette fonction qu'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() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
En bref, l'utilisation de fonctions anonymes plutôt que de fonctions nommées n'entraîne aucun coût de performance observable.
Soit dit en passant, il peut sembler, d'après ce qui précède, qu'il n'y a aucune différence entre :
function myEventHandler() { /* ... */ }
et :
var myEventHandler = function() { /* ... */ }
Le premier est un déclaration de fonction alors que le dernier est une affectation de variable à une fonction anonyme. Bien qu'ils puissent sembler avoir le même effet, JavaScript les traite de manière légèrement différente. Pour comprendre la différence, je vous recommande la lecture de " Ambiguïté des déclarations de fonctions JavaScript ".