La portée est toujours la priorité absolue dans tout langage de programmation car elle contrôle le cycle de visibilité et de vie des variables et des paramètres. En parlant de cela, comprenez d'abord deux concepts: la portée et la portée de la fonction au niveau du bloc.
Qu'est-ce qu'une portée au niveau des blocs?
L'instruction définie dans n'importe quelle paire d'accès bouclées ({et}) appartient à un bloc, et toutes les variables définies dans ce domaine sont invisibles en dehors du bloc de code, que nous appelons la portée au niveau du bloc.
La portée de la fonction est facile à comprendre (* ^ __ ^ *), et les paramètres et variables définis dans la fonction sont invisibles en dehors de la fonction.
La plupart des langues de classe C ont des lunettes de niveau bloc, mais JS ne le fait pas. Veuillez consulter la démo ci-dessous:
// Langue C # inclut <stdio.h> void main () {int i = 2; je--; if (i) {int j = 3; } printf ("% d / n", j); }Lors de l'exécution de ce code, une erreur de "Utiliser une variable non définie: J" apparaîtra. Comme vous pouvez le voir, le langage C a une portée au niveau du bloc car J est défini dans le bloc d'instructions de If, donc il est inaccessible en dehors du bloc.
Et comment JS fonctionne-t-il, regardons une autre démo:
functin test () {for (var i = 0; i <3; i ++) {} alert (i); } test();Exécutez ce code et "3" apparaît. On peut voir qu'en dehors du bloc, la variable que j'ai définie dans le bloc est toujours accessible. Autrement dit, JS ne prend pas en charge les lunettes de niveau bloc, il ne prend en charge que les portées de fonction et les variables définies n'importe où dans une fonction sont visibles n'importe où dans cette fonction.
Alors, comment pouvons-nous faire que JS a une portée au niveau du bloc? Rappelez-vous encore que lorsque la variable définie dans une fonction est appelée, la variable sera détruite? Pouvons-nous utiliser cette fonctionnalité pour simuler la portée au niveau du bloc de JS? Regardez la démo suivante:
fonction test () {(function () {for (var i = 0; i <4; i ++) {}}) (); alerte (i); } test();Exécutez-le à nouveau à ce moment, une erreur non définie de "I" apparaîtra. Haha, il est implémenté ~~~ Ici, nous mettons le bloc de déclaration pour une fermeture et appelons cette fonction. Une fois l'appel de fonction terminé, la variable je sera automatiquement détruite, nous ne pouvons donc pas y accéder en dehors du bloc.
La caractéristique de fermeture de JS est la caractéristique la plus importante ((* ^ __ ^ *) que tout le monde comprend). Dans JS, afin d'éviter les conflits de dénomination, nous devons essayer d'éviter d'utiliser des variables globales et des fonctions globales. Alors, comment l'éviter? OK, comme indiqué dans la démo ci-dessus, nous pouvons mettre tout ce que nous voulons définir en un
(function () {// contenu}) ();Parmi eux, pour le moment, est-il équivalent à l'ajout d'une portée de fonction à leur couche externe? Les programmes en dehors de cette portée ne peuvent pas y accéder.