34 votes

Y a-t-il des inconvénients à utiliser des fonctions anonymes en JavaScript? Par exemple, l'utilisation de la mémoire?

À un certain moment dans le passé, j'ai lu quelque chose qui m'a donné l'idée que les fonctions anonymes en JavaScript peut utiliser une quantité surprenante de la mémoire (car ils sont porteurs de la totalité de l'étendue actuelle autour avec eux), alors que le nommé (statique?) les fonctions n'ont pas ce problème.

Je ne me souviens plus où j'ai lu cela, je ne peux pas revenir en arrière et re-lire et comprendre cela pour moi-même.

J'ai deux questions:

  1. Existe-il des situations où les fonctions anonymes, peut utiliser assez de mémoire pour qu'il soit la peine de se soucier? (Si oui, avez-vous un exemple?)
  2. Existe-il d'autres inconvénients pour les fonctions anonymes (par opposition à l'/fonctions statiques)?

8voto

user113716 Points 143363

Toutes les fonctions JavaScript se comportent de la même manière qu'ils héritent des environnements variables dans toute l'étendue de la chaîne menant jusqu'à, et y compris, eux-mêmes. Ceci est également vrai pour les deux anonymes et des fonctions nommées.

Cette chaîne de références à l'extérieur des environnements de séjours avec chaque fonction, même si la fonction est passée dans une tout autre portée.

Traditionnellement, cela signifierait que toutes les variables dans toute la chaîne de référence retenus pour eux aussi longtemps que l'intérieur de la fermeture continue d'exister. Bien que dans les navigateurs modernes que de compiler le code, il est probable qu'il y aura une analyse de variables qui sont effectivement référencé, et uniquement ceux-ci seront conservés, permettant à d'autres qui ne sont plus référencés à ordures.

Cependant, il existe d'autres situations où une fonction anonyme est une source de gaspillage.

Voici un bout de code:

for( var i = 0; i < 100; i++ ) {
    (function( j ) {
        setTimeout( function() { console.log( j ); }, 1000 );
    })( i );
}

C'est une situation où une fonction anonyme est un peu plus gourmands que d'une fonction nommée parce que vous êtes à la recréation d'une fonction identique de 100 fois au cours de la boucle quand vous pourriez réutiliser un nommé un.

function setConsole( j ) {
    setTimeout( function() { console.log( j ); }, 1000 );
}

for( var i = 0; i < 100; i++ ) {
    setConsole( i );
}

C'est exactement la même fermeture des frais généraux, mais il est plus efficace parce que vous avez construit une fonction pour créer chaque nouvelle variable d'environnement.

http://jsperf.com/immediate-vs-named (Merci à @Felix Kling pour la jsPerf.)

Donc, à l'égard de la fermeture en particulier, oui, il ya surcharge de tant que vous maintenez la fermeture par certains de référence permanent. Je dirais qu'il est bon d'éviter cette situation, si possible, mais de ne pas être obsédé à ce sujet. Parfois, une nouvelle variable d'environnement ajoutées à la portée de la chaîne est tout simplement la meilleure solution.


EDIT: Voici un article à partir de Google. Plus précisément, voir en Évitant les pièges avec des fermetures. pour plus d'informations sur l'impact sur les performances de l'extension de la portée de la chaîne, et pour prétendre que les fonctions anonymes sont "lents" que les fonctions nommées.

3voto

Tikhon Jelvis Points 30789

Je pense que ce que vous avez probablement lu à propos était de l'IE fermeture de problème de fuite de mémoire.

Regardez cet article sur la question.

En gros, sur les anciennes versions d'IE, le garbage collector ne pouvait pas gérer les références circulaires impliquant des objets DOM. Depuis les fermetures sont très favorables à ce type de références circulaires, ils pourraient facilement conduire à gênants fuites de mémoire dans IE.

0voto

The Brawny Man Points 447

Cela est vrai, en raison des fermetures qui sont créées. en règle générale, le plus gros problème avec la pratique est les problèmes de performances avec IE (en particulier les anciennes versions d'IE), qui a une expérience terrible de les traiter correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X