Maison >interface Web >js tutoriel >Explication des connaissances sur la portée et la fermeture en javaScript
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. 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;
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);
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;
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 !
1. Regardez le code suivant :
foo(); function foo(){ console.log(a); var a=2; }
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();
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(){ //.... }
Une fois ce code amélioré, il ressemble à ceci :
var foo; foo(); TypeError bar(); ReferenceError foo=function (){ var bar... //.... }
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!