1.var
的声明提前机制
(function(){
var xx=500;
(function (){
console.log(xx);//undefined
var xx = 200;
})()
})()
理解:由于var
的变量声明提前,所以,检测到此作用域已经存在变量xx
,故不会去上一级寻找,但由于变量声明提前的机制,并没有将赋值的动作提前,只是告诉了这个作用域,已经声明了xx
这个变量而已。
因此,上面的情况同下:
(function(){
var xx=500;
(function (){
var xx;
console.log(xx);//undefined
xx = 200;
})()
})()
2.let
的作用域暂时性死区
(function(){
let xx=500;
(function (){
console.log(xx);//报错:'Uncaught TypeError:...'
let xx = 200;
})()
})()
理解:let
的变量声明不会提前,但依然会作用于整个 {}
,而对于提前调用此变量的操作,都会抛出一个错误。而在 {
到 let
定义变量之前的这一个区域,被称为暂时性死区