JavaScript变量提升

1
2
3
4
5
6
7
8
9
var a = 0;
function func() {
console.log(a); // undefined
if(a){
var a = 1;
console.log(a) // 不会执行此行代码
}
}
func()

这里主要涉及js变量提升这个知识点。

在js预解析阶段,解析引擎遇到变量声明,会将其提升至作用域的顶部;这就是变量提升;遇到函数声明,会将函数标识符连同函数体一起,提升至作用域顶部,这就是函数声明提升。

回到代码,当预解析func函数时,遇到var a = 1,会将var a;提升至func函数作用域顶部,预解析阶段完毕后,进入执行阶段,console.log(a)因为此时a只是声明了,并没有赋值,因此是undefined,既然a是undefined,那么后面的if判断也就不会执行了。

预解析之后,代码如下:

1
2
3
4
5
6
7
8
9
10
var a = 0;
function func() {
var a;
console.log(a); // undefined
if(a){
a = 1;
console.log(a) // 不会执行此行代码
}
}
func()