Une fermeture est essentiellement une fonction B imbriquée dans une fonction A qui peut accéder à des variables locales A:
function A() {
var x = 5;
function B() {
print(x);
}
return B;
}
Si vous venez d'un c'est fond C++, assez difficile à digérer. Lorsque nous essayons d'appeler la fonction retournée par A, à quoi va-t-il se référer? Est-ce que ce x
ne sera pas invalide puisque A()
s'est terminé? La réponse est que x
vit effectivement. Ce B
nous sommes retournés porte effectivement x
avec implicitement. Cool, hein?
Dans un sens plus général, une fermeture est une fonction liée à certaines données. Dans un langage sans fermetures comme C, chaque programme a un nombre fixe de fonctions. Avec les fermetures, vous pouvez, en un sens, "créer des fonctions" en les liant à des données dynamiques. Bien sûr, personne ne vous empêche d'imiter les fermetures en C, mais cela peut parfois être douloureux.
Les fermetures sont vraiment utiles. Par exemple, supposons que nous voulons mettre en œuvre notre propre « boucle »:
function loop(count, f) {
for (var i = 0; i < count; i++)
f(i);
}
var array = [0,1,2,3,4];
loop(5, function(i) {
print(array[i]);
});
être autorisé à accéder à des variables extérieures sans faire un tas de bêtises supplémentaires de garder le code agréable et simple. Sans fermetures, vous pourriez avoir à passer une variable de contexte à la place fonction loop
:
function loop(count, f, ctx) {
for (var i = 0; i < count; i++)
f(i, ctx);
}
var array = [0,1,2,3,4];
loop(5, function(i, ctx) {
print(ctx[i]);
}, array);
Un autre exemple: supposons que nous voulons enregistrer un rappel dans jQuery, mais il peut être exécuté longtemps après que la fonction et de son appelant et son l'appelant de l'appelant sont fait en cours d'exécution:
$(document).ready(function(){
var clicked = 0;
$('#button').click(function(){
clicked++;
alert("You've pressed the button " + clicked + " times.");
});
});
Si JavaScript ont été plus comme C++ (avant C++ 0x), que clicked
variable serait révolue depuis longtemps au moment où la fonction donnée à $(document).ready()
a été appelée, et le clic de bouton le rappel aurait un comportement indéfini.
Questions http://stackoverflow.com/questions/36636/what-is-a-closure et http://stackoverflow.com/questions/1095707/what-is-the-exact-definition-of-a- la fermeture est similaire à celle-ci –