当程序执行这一段代码时code
console.log(a); var a = 2;
有经验的同窗都知道控制台会输出undefined
而不是报错a is not defined
这是由于此时发生了变量提高,代码能够理解为如下形式ip
var a; console.log(a);// undefined a = 2;
这是为何呢,让我先说明如下几点作用域
var
关键字声明的变量是在编译阶段声明的。每当编译器遇到var xxx
,都会去查找当前做用域是否已存在变量xxx
,若是xxx
已存在,则忽略该声明,反之,在当前做用域声明变量xxx
。
因此当成程序执行下面代码时编译器
console.log(a); var a = 2;
a
,发现a
并不存在,声明变量a
。console.log(a)
,此时变量a
已经被编译器声明,可是还未被赋值,因此此时控制台输出的值是undefined
。a = 2
,此时变量a的值为2。其实关键点就在于,由var
关键字声明的变量是在编译阶段
声明的,因此会出现变量提高的状况。
可是编译器对ES6语法中的const
和let
关键字声明的变量则不会提早声明,因此不会出现变量提高。console