Maison > Article > interface Web > Explication détaillée de l'utilisation de la portée javascript et des connaissances de fermeture_Basic
L'imbrication des portées formera une chaîne de portées, et l'imbrication des fonctions formera une fermeture. Les fermetures et les chaînes de portée sont l'une des fonctionnalités importantes qui distinguent JavaScript des autres langages.
Portée
Il existe deux types de portée en JavaScript : la portée de la fonction et la portée globale.
Les variables déclarées dans une fonction et les paramètres de la fonction partagent la même portée, c'est-à-dire la portée de la fonction. Un exemple simple de portée de fonction :
Contrairement à d'autres langages à portée de bloc tels que C, cela renverra toujours 2 .
La portée globale, pour les navigateurs, peut être comprise comme l'objet window (Node.js est global) :
La variable bar et la fonction foo appartiennent à la portée globale et sont toutes deux des attributs de window.
Chaîne de portée
Lors de l'accès à une variable en JavaScript, elle partira des variables et paramètres locaux et parcourra la portée étape par étape jusqu'à ce qu'elle atteigne la portée globale.
Fermeture
Dans une fonction, la définition d'une autre fonction est appelée imbrication de fonctions. L'imbrication des fonctions formera une fermeture.Les fermetures et les chaînes de portées se complètent. L'imbrication des fonctions crée non seulement plusieurs portées dans une relation en chaîne, mais forme également une fermeture.
Copier le code
Mais les fonctions intégrées peuvent accéder aux paramètres et variables des fonctions externes
En d'autres termes : les fonctions intégrées Contient la portée du fonction externe Regardons l'exemple de chaîne de portée mentionné précédemment, en le comprenant cette fois du point de vue de la fermeture :
Copier le code
La fonction la plus interne peut accéder à toutes les variables définies en interne et en externe. L'avant-dernière fonction ne peut pas accéder à la variable la plus interne. En même temps, l'opération d'affectation de scope = 3 dans la couche la plus interne n'affecte pas la variable externe du même nom.
Comprenons la clôture sous un autre angle :
Chaque fois qu'une fonction externe est appelée, la fonction intégrée sera créée une fois
Lors de sa création, la portée de la fonction externe (y compris les variables locales, les paramètres, etc. le contexte) deviendra chaque fonction intégrée. objet. fait partie de l’état interne, même après que la fonction externe a terminé son exécution et s’est terminée
Voir l’exemple suivant :
Nous obtiendrons "2" deux fois au lieu des "1" et "2" attendus. En effet, la variable à laquelle j'ai accédé par les deux fonctions de la liste est la même variable dans la portée supérieure.
Modifions le code pour utiliser des fermetures pour résoudre ce problème :
La "fonction d'exécution immédiate" externe reçoit une variable de paramètre i, qui existe sous la forme de paramètre j au sein de sa fonction. Elle pointe vers la même référence que le nom j dans la fonction interne renvoyée. Une fois la fonction externe exécutée et sortie, le paramètre j (sa valeur est la valeur actuelle de i à ce moment) fait partie de l'état de sa fonction interne et est enregistré.