Fermeture Javascript

Je lis le () à la fin de la fermeture l'exécutera immédiatement. Alors, quelle est la différence entre ces deux. J'ai vu la première utilisation dans un certain code.

Merci.

for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){ (function(val){ anotherFn(val); })(a[i]); } for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){ anotherFn(a[i]); } 

Dans cet exemple, il n'y a pas de différences. Dans les deux cas, anotherFn est exécuté immédiatement.

Cependant, une fonction immédiate est souvent utilisée lorsqu'une fonction est créée dans une boucle.

Considérons cet exemple (plus ou moins de pseudo code):

 for(var i from 1..10) { elements[i].onclick = function() { alert(values[i]); } } 

Comme JavaScript n'a que la portée de la fonction, aucune portée de bloc, tous les gestionnaires d'événements partagent le même i , qui aura la valeur 10 après la fin de la boucle. Donc, tous les gestionnaires tenteront d'alerter les values[10] .

En utilisant une fonction immédiate, une nouvelle portée est introduite qui "capture" la valeur actuelle de la variable de boucle:

 for(var i from 1..10) { (function(index) { elements[i].onclick = function() { alert(values[index]); } }(i)); } 

Comme cela est parfois difficile à lire, créer une fonction autonome qui renvoie une autre fonction est souvent mieux:

 function getHandler(value) { return function(){alert(value);}; } for(var i from 1..10) { elements[i].onclick = getHandler(values[i]); } 

Dans les deux cas de votre exemple, les valeurs effectuent des opérations identiques. Il existe d'autres exemples là où, si vous n'êtes pas prudent d'utiliser la première méthode (avec la fonction anonyme auto-exécutable), la valeur de i augmentera et ne sera pas correctement transmise à votre fonction.

Voici un guide, faites défiler jusqu'à la création de fermetures dans les boucles: une section d' erreur commune pour voir le problème:

https://developer.mozilla.org/fr/JavaScript/Guide/Closures

La première définit une fonction d' auto-appel (qui à son tour exécute une fonction), la seconde n'exécute que la fonction. Dans les deux cas, l'argument passé à l'est est un [i].