1. La portée des variables
Pour comprendre les fermetures, vous devez d'abord comprendre la portée de la variable spéciale de JavaScript.
Il n'y a que deux types de lunettes de variables: les variables globales et les variables locales.
La caractéristique spéciale du langage JavaScript est que les variables globales peuvent être lues directement dans les fonctions.
var n = 999; fonction f1 () {alert (n); } f1 (); // 999D'un autre côté, les variables locales à l'intérieur de la fonction ne sont naturellement pas lues en dehors de la fonction.
fonction f1 () {var n = 999; } alert (n); // erreurIl y a un endroit pour noter ici. Lors de la déclaration des variables en interne, vous devez utiliser la commande var. Sinon, vous déclarez réellement une variable globale!
fonction f1 () {n = 999; } f1 (); alerte (n); // 9992. Comment lire les variables locales de l'extérieur?
Pour diverses raisons, nous devons parfois obtenir des variables locales dans la fonction. Cependant, comme mentionné précédemment, dans des circonstances normales, cela ne peut pas être fait et ne peut être réalisé que par des solutions de contournement.
C'est-à-dire définir une autre fonction à l'intérieur de la fonction.
fonction f1 () {var n = 999; fonction f2 () {alert (n); // 999}}Dans le code ci-dessus, la fonction F2 est incluse à l'intérieur de la fonction F1, et toutes les variables locales à l'intérieur de F1 sont visibles par F2. Mais l'inverse n'est pas possible. Les variables locales à l'intérieur de F2 sont invisibles à F1. Il s'agit de la structure de la "chaîne de chaîne" unique à la langue javascript. Les objets enfants regarderont le niveau vers le haut par niveau pour toutes les variables d'objets parents. Par conséquent, toutes les variables de l'objet parent sont visibles par l'objet enfant, sinon ce n'est pas vrai.
Puisque F2 peut lire les variables locales en F1, tant que F2 est utilisée comme valeur de retour, ne pouvons-nous pas lire ses variables internes en dehors de F1?
fonction f1 () {var n = 999; fonction f2 () {alert (n); } return f2; } var result = f1 (); résultat(); // 9993. Le concept de fermeture
La fonction F2 dans la section précédente du code est la fermeture.
La définition de la «fermeture» dans divers documents professionnels est très abstraite et difficile à comprendre. Ma compréhension est qu'une fermeture est une fonction qui peut lire les variables à l'intérieur d'autres fonctions.
Étant donné que dans le langage JavaScript, seules les sous-fonctions à l'intérieur des fonctions peuvent lire les variables locales, les fermetures peuvent être simplement comprises comme "des fonctions définies à l'intérieur d'une fonction".
Ainsi, en substance, une fermeture est un pont reliant l'intérieur et l'extérieur de la fonction.
4. Le but de la fermeture
Les fermetures peuvent être utilisées dans de nombreux endroits. Il a deux plus grandes utilisations, l'une est que les variables à l'intérieur de la fonction peuvent être lues comme mentionné ci-dessus, et l'autre est que les valeurs de ces variables sont toujours conservées en mémoire.
Comment comprendre cette phrase? Veuillez consulter le code ci-dessous.
fonction f1 () {var n = 999; nadd = function () {n + = 1} fonction f2 () {alert (n); } return f2; } var result = f1 (); résultat(); // 999 nadd (); résultat(); // 1000Dans ce code, le résultat est en fait la fonction F2 de fermeture. Il fonctionne deux fois au total, la première valeur est de 999 et la deuxième valeur est de 1000. Cela prouve que la variable locale n dans la fonction F1 a été maintenue en mémoire et n'est pas effacée automatiquement après l'appel F1.
Pourquoi cela se produit-il? La raison en est que F1 est la fonction parent de F2, et F2 est affecté à une variable globale, ce qui fait que F2 est toujours en mémoire, et l'existence de F2 dépend de F1. Par conséquent, F1 est toujours en mémoire et ne sera pas recyclé par le mécanisme de collecte des ordures une fois l'appel terminé.
Un autre point notable de ce code est que la ligne "nadd = function () {n + = 1}" est d'abord utilisée avant NADD, donc NADD est une variable globale, pas une variable locale. Deuxièmement, la valeur de NADD est une fonction anonyme, et cette fonction anonyme elle-même est également une fermeture, donc NADD est équivalent à un secteur, qui peut fonctionner sur des variables locales à l'intérieur de la fonction en dehors de la fonction.
5. Notes sur l'utilisation des fermetures
1) Étant donné que les fermetures entraîneront le stockage de toutes les variables de la fonction en mémoire et que la consommation de mémoire est très importante, les fermetures ne peuvent pas être abusées, sinon elle entraînera des problèmes de performances de la page Web et peut entraîner des fuites de mémoire dans IE. La solution consiste à supprimer toutes les variables locales qui ne sont pas utilisées avant de quitter la fonction.
2) La fermeture modifiera la valeur de la variable à l'intérieur de la fonction parent à l'extérieur de la fonction parent. Par conséquent, si vous utilisez la fonction parent comme un objet, utilisez la fermeture comme méthode publique et utilisez la variable interne comme propriété privée, veillez à ne pas modifier la valeur de la variable interne de la fonction parent à volonté.