Le problème de performance est ici le coût de la création d'un nouvel objet de fonction à chaque itération de la boucle et non le fait que vous utilisez un anonyme fonction:
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = function() {
// do something
};
}
Vous créez un millier d'objets fonction distincte, même si elles ont le même corps de code et aucune liaison à la portée lexicale (closure). Ce qui suit semble plus rapide, d'autre part, parce qu'elle affecte simplement la même référence de fonction 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 deviez créer la fonction anonyme avant d'entrer dans la boucle, alors seulement attribuer des références à ce document aux éléments du tableau tandis que l'intérieur de la boucle, vous constaterez qu'il n'y a pas de performance ou la différence sémantique que ce soit par rapport à la version de fonction nommée:
var handler = function() {
// do something
};
for (var i = 0; i < 1000; ++i) {
myObjects[i].onMyEvent = handler;
}
en bref, il n'y a pas de frais de performance observable en utilisant des fonctions anonymes sur-nommées.
En aparté, il peut apparaître 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 alors que celle-ci est une variable affectation à une fonction anonyme. Bien qu'ils puissent sembler avoir le même effet, JavaScript les traite légèrement différemment. Pour comprendre la différence, je recommande de lire "JavaScript function declaration ambiguity".
La durée d'exécution réelle de toute approche dépend en grande partie de l'implémentation du compilateur et de l'environnement d'exécution par le navigateur. Pour une comparaison complète des performances du navigateur moderne, visitez the JS Perf site
Je sais que ce n'est pas dans la question, mais en ce qui concerne la propreté du code/la lisibilité, je pense que la «bonne façon» est quelque part au milieu. "Clutter" des fonctions de premier niveau rarement utilisées est ennuyeux, mais le code fortement imbriqué dépend beaucoup des fonctions anonymes qui sont déclarées en ligne avec leur invocation (pensez à node.js callback hell). Le premier et le second peuvent rendre le traçage de débogage/exécution difficile. –
Les tests de performances ci-dessous exécutent la fonction pour des milliers d'itérations. Même si vous voyez une différence substantielle, une majorité des cas d'utilisation ne le feront pas dans les itérations de cet ordre. Par conséquent, il est préférable de choisir ce qui convient à vos besoins et ignorer les performances pour ce cas particulier. – Medorator
@nickf bien sûr sa trop vieille question, mais voir la nouvelle réponse mise à jour –