L'une des fonctionnalités les plus importantes de JavaScript est l'utilisation de fermetures. En raison de l'utilisation des fermetures, la portée actuelle peut toujours accéder aux lunettes externes. Étant donné que JavaScript n'a pas de portée au niveau du bloc et de seule portée des fonctions, l'utilisation des fermetures est étroitement liée aux fonctions.
Simuler les variables privées
La copie de code est la suivante:
fonction compteur (start) {
var count = start;
retour {
incrément: function () {
Count ++;
},
get: function () {
Return Count;
}
}
}
var foo = compteur (4);
foo.increment ();
foo.get (); // 5
Ici, le compteur renvoie deux fermetures: incrément de fonction et obtenez. Ces deux fonctions maintiennent l'accès à la portée du compteur, afin qu'elles puissent accéder au nombre de variables défini dans la portée du comte.
Mécanisme de travail des variables privées
Étant donné que JavaScript ne peut pas attribuer des valeurs et des références aux lunettes, dans l'exemple ci-dessus, il n'y a aucun moyen d'accéder directement au nombre de variables privées interne de l'extérieur. Le seul moyen est d'y accéder en définissant la fermeture.
La copie de code est la suivante:
var foo = nouveau compteur (4);
foo.hack = function () {
Count = 1337;
};
Le code ci-dessus ne modifie pas la valeur de la variable de comptage dans la portée du compteur, car le piratage n'est pas défini dans le compteur. Le code ci-dessus ne créera ou écrasera que le nombre de variables globales.
Fermetures dans la boucle
L'une des erreurs les plus simples consiste à utiliser des fermetures dans une boucle.
La copie de code est la suivante:
pour (var i = 0; i <10; i ++) {
setTimeout (function () {
console.log (i);
}, 1000);
}
Le code ci-dessus ne sortira pas de 0 à 9, mais sortira 10 fois en continu.
L'anonymat ci-dessus gardera une référence à la variable i. Lorsque la fonction Console.log est appelée pour démarrer la sortie, c'est la boucle qui s'est terminée, et la variable I est déjà 10.
Pour éviter l'erreur ci-dessus, nous devons créer une copie de la variable que je valorisons chaque fois que nous boucle.
Évitez les erreurs de citation
Pour copier la valeur d'une variable dans la boucle, la meilleure façon est d'ajouter une fonction anonyme à la couche externe et de l'exécuter immédiatement.
La copie de code est la suivante:
pour (var i = 0; i <10; i ++) {
(fonction (e) {
setTimeout (function () {
console.log (e);
}, 1000);
})(je);
}
Cette fonction anonyme externe prend la variable de boucle I comme premier paramètre et copie sa valeur à son propre paramètre e.
La fonction anonyme externe transmet le paramètre E à setTimeout, donc setTimeout a une référence au paramètre e. De plus, la valeur de ce paramètre E ne changera pas en raison des modifications de boucle externe.
Il existe un autre moyen d'obtenir le même effet, qui est de renvoyer une fonction anonyme dans la fonction anonyme dans Settimeout:
La copie de code est la suivante:
pour (var i = 0; i <10; i ++) {
setTimeout ((fonction (e) {
return function () {
console.log (e);
}
}) (i), 1000)
}
De plus, il peut également être réalisé via la méthode de liaison.
La copie de code est la suivante:
pour (var i = 0; i <10; i ++) {
setTimeout (console.log.bind (console, i), 1000);
}
À la fin de l'article, résumons:
(1) La fermeture est un principe de conception. Il simplifie les appels utilisateur en analysant le contexte, permettant à l'utilisateur d'atteindre son objectif sans le savoir;
(2) Les articles en ligne traditionnels sur l'analyse des fermetures sont en fait contraires au principe de fermeture. Si vous avez besoin de connaître les détails de la fermeture à bien utiliser, cette fermeture est une défaillance de conception;
(3) Essayez d'apprendre le moins possible.