Une confusion sur les variables globales JavaScript
ringa_lee
ringa_lee 2017-05-18 10:56:05
0
5
606

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 !

ringa_lee
ringa_lee

ringa_lee

répondre à tous(5)
刘奇
// ①
console.log(b); // 代码执行到这行的时候,b未定义,在当前的作用域链上找不到b,所以 b is not defined
b = 2; 

// ②
console.log(b);
var b = 2;
// 由于变量声明提升,相当于
var b;
console.log(b); // 代码执行到这行的时候,b已经声明了,只是没有赋值而已,所以 undefined
b = 2; 

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 :

Les variables déclarées sont créées avant l'exécution de tout code, tandis que les variables non déclarées ne sont créées que lorsque les opérations d'affectation sont effectuées.

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

console.log(a);
var a = 1;

sera interprété par le compilateur comme

var a;
console.log(a);
a = 1;

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

  1. 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.

  2. 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal