Maison > interface Web > js tutoriel > le corps du texte

Explication des connaissances sur la portée et la fermeture en javaScript

php是最好的语言
Libérer: 2018-08-09 11:36:07
original
1809 Les gens l'ont consulté

Résumé de la révision : le comportement de la portée de la fonction et de la portée du bloc est le même. On peut considérer que toute variable déclarée dans une certaine portée sera attachée à cette portée.

1. Pourquoi cela ?

1. Maintenant, nous posons deux questions et donnons les deux morceaux de code suivants. Veuillez d'abord réfléchir aux résultats de sortie, puis mettre en pratique, je pense que vous aurez des doutes !

//第一段代码
a=2;
var a;
console.log(a);

//第二段代码
console.log(a);
var a=2;
Copier après la connexion

2. Je suppose que le résultat est comme ceci : vous devinez que le résultat du premier morceau de code est sous-fin, puis le résultat de son exécution sur le navigateur est 2 ; le deuxième morceau de code est 2, mais lorsque vous parcourez, le résultat de l'exécution sur le serveur est sous-défini. frère! Est-ce le cas (même si ce n'est pas le cas, je suppose que vous devez faire d'autres formes de suppositions erronées).

3. Expliquons pourquoi le résultat du premier code est 2, et le résultat du deuxième code est indéfini. Tout d'abord, rappelons ce que nous avons dit précédemment, à savoir qu'un code avec var a=2 ressemble à deux. codes en JS. Extrait de code : var a et a=2 ; le premier est exécuté lors de la compilation et le second est exécuté au moment de l'exécution, alors quelle est la question ? Les déclarations de variables et de fonctions seront traitées avant l'exécution du programme, donc l'ordre d'exécution du code est-il toujours l'ordre d'écriture que vous voyez ?

4. Pour le premier morceau de code, la deuxième ligne de code var a est traitée en premier lors de la compilation, et les première et troisième lignes sont traitées au moment de l'exécution. Ensuite, la forme de traitement de l'ensemble du code est la suivante. :

//第一段代码被JS这样的顺序处理了
var a;
a=2;
console.log(a);
Copier après la connexion

Regardez ! Vous pouvez le comprendre de cette façon, oh ! Déclarez d'abord, puis attribuez, puis imprimez.

5. Pour la même raison, le deuxième morceau de code est traité comme suit :

//第二段代码被JS以这样的形式处理:
var a;
console.log(a);
a=2;
Copier après la connexion

A a été déclaré lors de la compilation, mais lors de son exécution, a n'a pas reçu de valeur. avant console.log(a), et bien sûr il est sous-fin lors de l'impression

6 Par conséquent, lorsque le code est traité par JS, la position de la déclaration des variables et des fonctions dans le code ; on dirait qu'il a été déplacé en haut de la portée Ce processus prioritaire déclaré lors du processus de compilation est de promouvoir !

2. Chaque portée sera promue

1. Regardez le code suivant :

foo();

function foo(){
    console.log(a);
    var a=2;
}
Copier après la connexion

La portée globale promouvra la déclaration de la fonction foo, dans un sera. promu dans le foo scope, et le formulaire de traitement est le suivant :

function foo(){
    var a;
    console.log(a);
    a=2;
}
foo();
Copier après la connexion

2. Attention particulière : La déclaration de fonction sera promue, mais l'expression de fonction ne sera pas promue . Expression de fonction nommée, l'identifiant du nom ne peut pas être utilisé dans la portée avant l'affectation Que signifient ces deux phrases ? Les deux morceaux de code suivants vous l'indiquent :

foo();  TypeError
bar();  ReferenceError
var foo=function bar(){
    //....
}
Copier après la connexion

Une fois ce code amélioré, il ressemble à ceci :

var foo;
foo();  TypeError
bar();  ReferenceError
foo=function (){
    var bar...
    //....
}
Copier après la connexion

Donc pour foo, il y a une instruction, mais il y a aucune affectation à foo, et foo n'est pas défini, alors opérer sur undefined est bien sûr une erreur de type d'opération. Et bar, même pas déclaré, est déclaré dans l'expression de fonction de foo, c'est donc une erreur non déclarée.

3. Pour la promotion : Les fonctions sont promues en premier, suivies des variables

Recommandations associées :

Compréhension approfondie de javascript ; portée et fermetures

Explication détaillée de la portée et des fermetures 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal