当顺序实行这一段代码时
console.log(a);
var a = 2;
有履历的同砚都晓得控制台会输出undefined
而不是报错a is not defined
这是由于此时发生了变量提拔,代码能够理解为以下情势
var a;
console.log(a);// undefined
a = 2;
这是为何呢,让我先申明以下几点
- 一段JavaScript代码,是先由编译器编译成可实行代码,再交给引擎去实行的。
- 用
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
症结字声明的变量则不会提早声明,所以不会涌现变量提拔。