深入理解ES6--临时死区(Temporal Dead Zone)

看我能坚持几天吧,我真的太需要一个大大的动力了。开始吧开始吧,废话贼多。

与var不同,let和const不会被提到作用域顶端,如果在声明之前访问这些变量,即使是相对安全的typeof也会触发错误。

if( condition ) {
console.log(typeof value); //引用错误!Uncaught ReferenceError: Cannot access 'value' before initialization
let value = blue;
}

由于console.log(typeof value)抛出错误,因此用let定义并初始化变量value的语句不会执行。此时的value还位于‘临时死区’。虽然ECMAScript标准并没有明确提到TDZ,但人们却常用它来描述let和const的不提升效果。

JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到var声明),要么将声明放到TDZ中(遇到let和const声明)。访问临时死区(TDZ)的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中移出来,然后就可以访问了。

在声明前访问由let定义的变量就是这样。即便是相对不易出错的typeof操作符也无法阻挡引擎抛出的错误。但在let声明的作用域外对该变量使用typeof则不会报错

console.log(typeof value); //undefined
if( condition ) {

let value = blue;
}

typeof是在声明变量value的代码块外执行的,此时value并不在TDZ中。这也就意味着不存在value这个绑定,typeof操作最终返回"undefined"。TDZ只是块级绑定的特色之一,而在循环中使用块级绑定也是一个特色。

posted @ 2021-12-05 14:58  幸福的波波肠  阅读(93)  评论(0编辑  收藏  举报