La soi-disant portée peut être simplement comprise comme une portée (zone) qui peut être lue et écrite. Certains étudiants ayant de l'expérience dans JS peuvent dire: "JS n'a pas de portée au niveau du bloc". En plus de la portée globale, seules les fonctions peuvent créer des lunettes. Un avantage de la portée est qu'il peut isoler les variables.
Nous utilisons quelques exemples pour nous aider à comprendre la portée de JS.
alerte (a); var a = 1;
Si les étudiants qui ne connaissent pas du tout la portée peuvent dire qu'Alert est 1 ou signale une erreur; Mais c'est en fait indéfini;
En parlant de cela, parlons d'abord de certains préparations réalisées avant JS analysant le code en ligne.
Avant de lire le code ligne par ligne, JS fera un peu de travail de "pré-parsement" et trouvera à l'avance des "petites choses". Bien sûr, "JS Parser" ne trouvera pas de données avec désinvolture, il les trouvera en fonction de VAR, de la fonction et des paramètres.
"JS Parser" est relativement "paresseux". Avant d'exécuter officiellement le code, il affectera la variable déclarée par VAR à Undefined, c'est-à-dire Var a = Undefined; Il considérera toute la fonction comme un bloc de code, quel que soit le code qu'il y a. Les paramètres seront dit dans les exemples plus tard.
Une fois tous les préparatifs effectués, le "JS Parser" commence à exécuter le code ligne par ligne. Maintenant, analysons l'exemple que nous avons commencé et il est facile de comprendre pourquoi il n'est pas défini.
Jetons un coup d'œil à l'exemple suivant
alerte (a); var a = 1; alerte (a); var a = 2; alerte (a);
Analysons un peu cela
Premier "préparation": l'analyseur recherchera var
Lors de la lecture de la deuxième ligne A = non définie;
Lors de la lecture de la quatrième ligne, toujours A = non défini;
Exécution officielle de code ligne:
Alerte de première ligne: indéfinie
La deuxième ligne a = 1;
Ligne 3 Alerte: 1;
L'alerte du cinquième élément: 2
Regardons l'exemple ci-dessous
alerte (a); var a = 1; alerte (a); fonction a () {alert (2); } alerte (a); var a = 3; alerte (a); fonction a () {alert (4); } alerte (a);Analysons ce petit peu à petit
Tout d'abord, "pré-parse": l'analyseur recherchera la fonction VAR;
Lors de la lecture de la deuxième ligne A = non définie;
Lors de la lecture de la quatrième ligne a = fonction a () {alert (2);} // Toutes les fonctions sont le bloc de fonction entier avant d'exécuter officiellement le code; Lorsqu'une variable rencontre un nom en double, une seule variable est laissée. Si la variable et la fonction sont du nom en double, seule la fonction est laissée.
Lors de la lecture de la sixième ligne, a = fonction a () {alert (2);}
Lors de la lecture de la huitième ligne, a = fonction a () {alert (4);}
Exécution officielle de code ligne:
Alerte de première ligne: fonction a () {alert (4);}
La deuxième ligne a = 1; // L'expression peut modifier la valeur pré-payée!
Ligne 3 Alerte: 1;
La quatrième ligne de fonction n'est pas appelée, sauter;
L'alerte du cinquième élément: 1;
Ligne six a = 3;
Ligne 7 Alerte: 3
La fonction de huitième ligne n'est pas appelée, sauter;
Ligne 9 Alerte: 3
Comme indiqué sur la figure:
Continuez à voir l'exemple:
var a = 1; fonction fn1 () {alert (a); // non défini var a = 2;} fn1 (); alerte (a); // 1Premier "préparation": l'analyseur recherchera la fonction VAR
Lors de la lecture de la première ligne A = non définie;
Lors de la lecture de la deuxième ligne fn1 = fonction fn1 () {alert (2); var a = 2;}
EXÉCUTION FORMALE DE CODE: première ligne A = 1;
L'appel de fonction de sixième ligne, entrez la portée de la fonction et toujours pré-parse dans la portée de la fonction, puis exécutez-le ligne par ligne.
Prépare dans la fonction: a = non défini;
Exécution: alerte: non définie;
a = 2; // a à l'heure actuelle n'est que dans la portée de la fonction et n'affectera pas un
La fonction est exécutée et revient à la portée globale;
Ligne sept alerte: 1;
continuer:
var a = 1; fonction fn1 () {alert (a); // 1 a = 2;} fn1 (); alerte (a); // 2La seule différence entre l'exemple ci-dessus est que A dans la fonction n'a pas VAR et analyse uniquement les points clés.
Dans l'alerte de la troisième ligne (a), dans la portée de la fonction, car il n'y a pas de var a dans la fonction, le "analyseur" recherchera A au niveau supérieur de la portée de la fonction (la détermination de la relation supérieure et de niveau inférieur dépend de la portée de la fonction. À l'heure actuelle, le niveau supérieur de la fonction est la portée globale. Dans la portée globale, a = 1, donc à ce moment, la troisième ligne alerte: 1, puis la quatrième ligne, a = 2 attribue la valeur, il n'y a toujours pas de a dans la portée de la fonction, donc trouver un dans la portée de niveau supérieur, c'est-à-dire la portée globale, et modifier A dans la lunette mondiale, donc a = 2 fera une lunette globale = 2, donc la séventh Line Alert: 2;
Ce point doit être compris clairement et faire attention à la différence entre VAR ou non.
Suivant:
var a = 1; fonction fn1 (a) {alert (a); // non défini a = 2; } fn1 (); alerte (a); // 1La différence entre cet exemple et la précédente est qu'il existe un paramètre supplémentaire. La fonction du paramètre est équivalente à une variable locale, c'est-à-dire qu'il y aura var a = non défini dans la pré-battant dans la fonction. Par conséquent, l'alerte de troisième ligne: non définie, et la quatrième ligne A = 2 modifie la portée de la fonction, ce qui n'affecte pas A dans le contexte global. L'alerte de septième ligne: 1;
alors:
var a = 1; fonction fn1 (a) {alert (a); // 1a = 2;} fn1 (a); alert (a); // 1Cet exemple est quelque peu différent de la précédente. Lorsque la fonction est appelée dans la sixième ligne, un paramètre est passé.
Faites attention à la différence entre ces exemples et ne les confondez pas.
Un autre:
var a = 1; fonction en () {var a = 2; fn ();} fonction fn () {alert (a); // 1} en ();A in fn n'est pas déclaré, et vous devez prendre la valeur dans la portée où la fonction est créée - elle est "créée", et non "appeler" la portée de la fonction.
PS: concepts de portée et de contexte en javascript
Les lunettes et les contextes en JavaScript sont uniques à cette langue, grâce en partie à la flexibilité qu'ils apportent. Chaque fonction a un contexte et une portée variables différents. Ces concepts sont soutenus par certains modèles de conception puissants en JavaScript. Cependant, cela entraîne également une grande confusion aux développeurs. Ce qui suit révèle entièrement les différences de contexte et de portée en JavaScript et comment divers modèles de conception les utilisent.
Contexte vs portée
La première question à clarifier est que le contexte et la portée sont des concepts différents. Au fil des ans, j'ai remarqué que de nombreux développeurs confondent souvent ces deux termes, en décrivant à tort l'un comme l'autre. Pour être juste, ces termes sont devenus très déroutants.
Chaque appel de fonction a une portée et un contexte qui y sont associés. Fondamentalement, la portée est basée sur la fonction et le contexte est basé sur des objets. En d'autres termes, la portée est liée à l'accès aux variables à chaque fois que la fonction est appelée, et chaque appel est indépendant. Le contexte est toujours la valeur du mot-clé ceci, une référence à l'objet qui appelle le code exécutable actuel.
Ce qui précède est la portée de JavaScript qui vous est présenté par l'éditeur (recommandé). J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!