Andy Hume assez bien donné la réponse, je veux juste ajouter un peu plus de détails.
Avec cette construction de la création d'une fonction anonyme à sa propre évaluation de l'environnement ou de la fermeture, et puis vous immédiatement de l'évaluer. La bonne chose à ce sujet est que vous pouvez accéder aux variables déclarées avant la fonction anonyme, et vous pouvez utiliser des variables locales à l'intérieur de cette fonction sans écraser accidentellement une variable existante.
L'utilisation de la var mots clés est très important, parce que dans le JavaScript chaque variable est globale par défaut, mais avec le mot-clé que vous créez une nouvelle, lexicalement d'étendue variable, qui est, il est visible par le code entre les deux accolades. Dans votre exemple, vous êtes essentiellement des création de courts-alias les objets de la YUI bibliothèque, mais il est plus puissant utilise.
Je ne veux pas vous laisser sans un exemple de code, donc je vais mettre ici un exemple simple pour illustrer une fermeture:
var add_gen = function(n) {
return function(x) {
return n + x;
};
};
var add2 = add_gen(2);
add2(3); // result is 5
Ce qui se passe ici? Dans la fonction *add_gen* la création d'une autre fonction à laquelle il suffit d'ajouter le nombre n de son argument. Le truc, c'est que dans les variables définies dans le paramètre de la fonction de la liste agir comme lexicalement d'étendue variables, comme celles définies avec var.
Le retour de la fonction est définie entre les accolades de la *add_gen* fonction de sorte qu'il aura accès à la valeur de n , même après add_gen fonction a fini de s'exécuter, c'est pourquoi vous obtenez 5 lors de l'exécution de la dernière ligne de l'exemple.
Avec l'aide de la fonction paramètres correspondant a une portée lexicale, vous pouvez contourner le "problème", découlant de l'utilisation de variables de boucle dans des fonctions anonymes. Prenons un exemple simple:
for(var i=0; i<5; i++) {
setTimeout(function(){alert(i)}, 10);
}
Les "attendus" résultat pourrait être les chiffres de zéro à quatre, mais vous obtenez quatre instances de fives à la place. Cela se produit car la fonction anonyme dans setTimeout et la boucle sont à l'aide de la même j' variable, donc, le temps que les fonctions sont évaluées, i , 5.
Vous pouvez obtenir les naïvement résultat attendu par l'aide de la technique dans votre question et le fait que les paramètres de la fonction sont lexicalement étendue. (J'ai utilisé cette approche dans une autre réponse)
for(var i=0; i<5; i++) {
setTimeout(
(function(j) {
return function(){alert(j)};
})(i), 10);
}
L'évaluation externe de la fonction vous êtes la création d'un complètement indépendant de la variable j dans chaque itération, et la valeur actuelle de je seront copiés dans cette variable, de sorte que vous obtiendrez le résultat de ce qui était naïvement attendre de l'essayer d'abord.
Je vous suggère d'essayer de comprendre l'excellent tutoriel à http://ejohn.org/apps/learn/ pour comprendre les fermetures de mieux, c'est là que j'ai appris très-très bien.