Cet article vous présente principalement en détail les fermetures JavaScript. En parlant de fermetures, je pense que les étudiants qui écrivent des front-ends le savent tous, et je pense que les fermetures ont été utilisées plus ou moins dans des projets réels. Alors, qu’est-ce qu’une fermeture exactement et comment se produit-elle ?
1. Qu'est-ce qu'une fermeture
mentionnée dans l'article du professeur Ruan :
Une fermeture est une fonction qui peut lire les variables internes d'autres fonctions. Puisque dans le langage Javascript, seules les sous-fonctions à l'intérieur de la fonction peuvent lire les variables locales, les fermetures peuvent être simplement comprises comme des « fonctions définies à l'intérieur d'une fonction ».
2. Les fonctions des fermetures
L'une consiste à lire les variables à l'intérieur de la fonction, et l'autre est de garder les valeurs de ces variables en mémoire.
3. Une instance de fermeture simple
Le résultat renvoyé de () est la fonction renvoyée dans la fonction count() et attribué à un. A ce moment, la variable locale num définie dans count() est enregistrée en mémoire. Lorsque a() est appelé pour la première fois, ++num est renvoyé, qui est 1 ; lorsque a() est appelé pour la deuxième fois, puisque num est 1 à ce moment, le résultat renvoyé est 2function count() { let num = 0; return function add() { return ++num; } }let a = count(); a(); //1a(); //24. Raisons de la fermeture Je pense que beaucoup de gens sont confus à propos de ce problème. Ils pensent qu'une fonction renvoie une fonction, formant ainsi une fermeture. En fait, ce n'est que la méthode de fermeture, pas la raison. La raison sera expliquée ci-dessous. La principale raison pour laquelle
est généré est que JavaScript a une portée lexicale, c'est-à-dire qu'il a reçu une portée lorsque la fonction définit
. Ensuite, au moment de l'exécution, une portée d'exécution lui sera attribuée en fonction de la situation d'exécution réelle. Ce n'est qu'à travers ces deux portées qu'une fonction JS peut être exécutée correctement. Prenons l'exemple ci-dessus comme exemple. Lorsque count() est exécuté, la portée de la fonction est Lorsque count() est exécuté et la fonction add est renvoyée, puisque add est dans
运行时作用域 num = 0 |
---|
词法作用域 |
, donc la portée lexicale de la fonction générée lors du retour est la portée du count() ci-dessus. Ainsi, lorsque a() est exécuté, sa portée réelle est Ainsi, lorsque add est appelé pour la première fois, puisque num vaut 0, 1 est renvoyé et la deuxième fois, il renvoie 2.
add运行时的作用域 |
---|
count运行时作用域 num = 0 |
count词法作用域 |
Recommandations associées :