Maison  >  Article  >  interface Web  >  Fermetures JavaScript en détail

Fermetures JavaScript en détail

小云云
小云云original
2018-02-07 14:51:511697parcourir

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 2
function count() {    let num = 0;    return function add() {        return ++num;
    }
}let a = count();
a();  //1a();  //2
4. 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

définit l'état
运行时作用域 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词法作用域
5. Résumé

De la description ci-dessus, on peut voir que lors de la génération d'une fermeture, les variables locales (portée d'exécution) de la fonction externe sont utilisées comme lexicales par le fonction interne L'oscilloscope est stocké en mémoire, donc la mémoire ne sera pas libérée tant que la fonction interne ne sera pas libérée. Par conséquent, lorsque vous utilisez des fermetures, vous devez faire très attention aux fuites de mémoire.

Recommandations associées :

Compréhension approfondie des fermetures JavaScript

Un résumé des fermetures JavaScript

Application simple d'exemples de fermeture JavaScript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn