Le code suivant :
console.log(b);
b = 2;
//"ReferenceError: b is not defined
Je pensais que ce serait indéfini une fois imprimé.
D'après ma compréhension, b = 2 n'utilise pas var, donc il déclare une variable globale Puisque la variable est déclarée, il y aura une promotion de déclaration de variable. Pourquoi y a-t-il ReferenceError : b n'est pas défini ?
Et essayez d'ajouter var :
console.log(b);
var b = 2;
//undefined
Il semble donc que l'utilisation de var et l'omission de var ne font pas seulement la différence entre les déclarations locales et globales ?
Débutants, donnez-moi quelques conseils, merci !
Il y a toujours une séquence d'exécution de code. . .
Point supplémentaire :
est directement
b = 2
这种创建全局变量的方式,其实质是变为全局对象上的一个属性,即window.b = 2
, donc il n'y a pas de promotion ou aucune variable de promotion déclarée à l'aide de var have déclaration promotion.Posez et répondez à vos propres questions et ajoutez encore une chose :
J'ai trouvé cette phrase sur mdn :
Cette phrase explique ma confusion quant à la raison pour laquelle la variable globale b n'est pas promue comme a. a est une variable déclarée, tandis que b est une variable non déclarée qui n'est définie que lors de l'exécution et n'est donc pas promue avant l'exécution.
Texte original : https://developer.mozilla.org...
La déclaration sera faite à l'avance
sera interprété par le compilateur comme
Et non déclaré/undéfini n'a aucune chance d'être promu, donc une erreur sera signalée dès son utilisation
Vous pouvez lire "Javascript You Don't Know" (Volume 1) sur ces problèmes de portée. Ils sont tous abordés ci-dessus
.Moteur---
Responsable du processus de compilation et d'exécution de l'ensemble du programme JavaScript du début à la fin.
Compilateur---
Ami du moteur, responsable de l'analyse syntaxique et de la génération de code.
Scope---
Un autre ami du moteur, chargé de collecter et de maintenir une série de requêtes composées d'identifiants déclarés (variables), et d'appliquer un ensemble de règles très strictes qui déterminent l'impact du code en cours d'exécution sur ces identifiants droits d'accès.
Quand vous voyez var a = 1;
En fait, le moteur pense qu'il y a ici deux déclarations complètement différentes, l'une est traitée par le compilateur au moment de la compilation et l'autre est traitée par le moteur au moment de l'exécution.
var a=1 ; décomposition
Lorsqu'il rencontre var a, le compilateur demandera à la portée s'il existe déjà une variable portant ce nom dans la collection de la même portée. Si tel est le cas, le compilateur ignorera la déclaration et poursuivra la compilation ; sinon, il demandera à la portée de déclarer une nouvelle variable dans la collection de la portée actuelle et de la nommer a.
Ensuite, le compilateur générera le code requis pour que le moteur fonctionne au moment de l'exécution. Ces codes sont utilisés pour gérer l'opération d'affectation de a=1. Lorsque le moteur est en cours d'exécution, il demande d'abord à la portée s'il existe une variable appelée a dans la collection de portée actuelle. Si tel est le cas, le moteur utilisera cette variable, sinon, le moteur continuera à rechercher la variable.