Javascript和全局范围声明

Javascript和全局范围声明,javascript,Javascript,在javascript中,编译阶段查找所有声明并将其与其相应的作用域相关联 案例1 如果未在严格模式下使用,则假定代码段实际处理为: var a; a = 2; console.log(a); 输出:2 案例2 如果声明发生在console.log()下面 这里的第1行:编译器将在其作用域中检查a的声明,如果找不到,则全局作用域将分配一个,并且假定相同的代码与 var a; console.log(a); a = 2; 输出:未定义//因为解释器读取控制台时未分配任何值

在javascript中,编译阶段查找所有声明并将其与其相应的作用域相关联

案例1 如果未在严格模式下使用,则假定代码段实际处理为:

var a;
a = 2;
console.log(a);
输出:2

案例2 如果声明发生在console.log()下面

这里的第1行:编译器将在其作用域中检查a的声明,如果找不到,则全局作用域将分配一个,并且假定相同的代码与

   var a; 
   console.log(a);
   a = 2;
输出:未定义//因为解释器读取控制台时未分配任何值

案例3 输出:参考


为什么这会抛出引用错误而不是未定义?

隐式全局变量表示
var
语句。它们之间没有任何关联。

隐式全局变量并不暗示
var
语句。没有提升它们。

如果仔细查看前两种情况,您总是声明变量
a
,而在JavaScript中,只有声明被提升

也就是说,在您的
案例3
中,变量
a
从未声明过,因此,此处不可能进行提升。这样,范围中就没有名为
a
的变量,因此,
ReferenceError

如果您查看的描述,其内容如下:

引用不存在的变量时,ReferenceError对象表示错误


如果仔细查看前两种情况,您总是声明变量
a
,而在JavaScript中,只有声明被挂起

也就是说,在您的
案例3
中,变量
a
从未声明过,因此,此处不可能进行提升。这样,范围中就没有名为
a
的变量,因此,
ReferenceError

如果您查看的描述,其内容如下:

引用不存在的变量时,ReferenceError对象表示错误

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