重新认识let 和 temporal dead zone(TDZ)

重新认识let 和 temporal dead zone(TDZ)

一般来说,我们对let的认识都停留在不会变量提升的层面上,我们都听说过很多次,而且一般情况下也验证了这点说法。比如下面的栗子:


console.log(name); // name is not defined
let name = 'name'; 

let真的不会变量提升(hoisted)吗?

讨论这个问题之前,我们先讨论一下scopedtemporal dead zone

有哪些作用域?

常见的有作用域: 全局作用域,函数作用域,和es6新增的块作用域。

block scoped 块作用域

定义:只要声明是有效的,在声明中的任意位置都可以使用{...}括号来为let创建一个用于绑定的块。
根据定义,通过一个{}括号就可以为let, const绑定一个作用域,在块之外的地方都无法访问

temporal dead zone

在进入作用域到声明该变量前的期间,都无法访问该变量,这个区域就叫做 temporal dead zone(TDZ);

TDZ和let变量提升的关系

讨论之前先看下面的栗子:


{  // TDZ start
    console.log(name); //Cannot access 'name' before initialization
    let name = 'name'; // TDZ end
}

根据上面的栗子,我们可以这样猜测,在进入scoped到declared 之前,产生了TDZ,在TDZ中,let定义的变量提升到顶部了,但是还是无法访问该变量。所以浏览器报的是Cannot access 'name' before initialization, 而不是name is not defined。它已经定义了,但是在没有初始化之前无法访问。

疑问?

为什么在全局作用域中,报的是name is not defined,难道在全局作用域中不存在TDZ? 这个疑问,有谁知道的可以留言交流一下。

posted @ 2020-03-11 17:50  =.=  阅读(398)  评论(0编辑  收藏  举报