[路飞]_let定义的变量是否会提升变量

我认为会

  1. 首先我们来看一下,当使用一个变量却没有定义这个变量会发生什么?
(function() {
console.log(x);//ReferenceError: x is not defined\
})()
复制代码

很显然,系统报错x没有被定义,这句话的意思就是压根找不到x。

  1. 我们再来看一下,正常定义变量会怎样?
(function() {
let x;
console.log(x);//undefined\
})()
复制代码

这里我们只是定义了x,但没有赋值,但是我们发现可以正常输出,值和var定义的变量等效了,都是undefined,说明这个变量可以被访问到且赋了一个默认值是undefined。

  1. 当我们使用变量是在let定义它之前会怎样?
(function() {
console.log(x);//ReferenceError: Cannot access 'x' before initialization\
let x = 3;
})()
复制代码

这是系统依然会报错,但是请注意,这个报错跟1中的报错是不同的,这里说x在被初始化之前无法被访问,那么按照报错的意思理解就是,我们只是没有权利访问x这个变量,但是x依然存在,只不过我们在使用的时候x还没有被初始化赋值,所以我们无权访问他,这就说明在使用时x已经被定义,在内存中存在,之所以报错是因为let导致了在let定义变量之前形成了“暂时性死区”,在这个死区中我们没权利使用这个变量。

所以由此可见let依然会造成变量提升,只不过,let到其所在作用域顶端的区域内是“暂时性死区”,在这个区域内没有权限去访问let定义的变量。

猜你喜欢

转载自juejin.im/post/7054173415225655303