ECMAScript 2015 时间死区 [重复]

Posted

技术标签:

【中文标题】ECMAScript 2015 时间死区 [重复]【英文标题】:ECMAScript 2015 Temporal Dead Zone [duplicate] 【发布时间】:2016-07-26 11:44:24 【问题描述】:

我是 ECMAScript 2015(ES6) 的新手,我正在阅读 ES6 中的时间死区:

if(typeof x === "undefined") 
   console.log("x doesn't exist or is undefined");
 else 
// safe to refer to x....

let x = 5;  //script.js:1 Uncaught ReferenceError: x is not defined

显然在 ES6 中,如果在声明变量之前使用 typeof 测试变量会引发错误

console.log(typeof x);
let x = 5;  //script.js:1 Uncaught ReferenceError: x is not defined

为什么会这样?这是一个错误吗?

【问题讨论】:

"如果您测试变量" - 绝对没有理由这样做。您可以阅读相关代码并查看它是否在范围内声明。这总是可以静态确定的(由程序员或他的工具),没有必要(也没有办法)动态地做到这一点。 别再担心奥秘了,专注于如何编写好的程序,其中一个方面是在作用域的顶部声明你的变量。 【参考方案1】:

事情就是这样:

Temporal dead zone and errors with let

在 ECMAScript 2015 中,let 会将变量提升到块的顶部。但是,在变量声明之前引用块中的变量会导致ReferenceError。从块开始到处理声明,变量都处于“临时死区”中。

【讨论】:

因此,如果我不能在使用“let”声明变量之前使用该变量(这很明显),如何检查变量是否已定义? 显然这是一个问题,声明的变量来自未定义类型,直到应用了其他值。最好的建议是尽快使用未定义的值,也许是 null。

以上是关于ECMAScript 2015 时间死区 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ECMAScript6学习笔记

Javascript时间死区[重复]

ECMAScript 6 let和const命令

javascript基础知识-时间死区,提升或关闭[重复]

ES2015中let的暂时性死区(TDZ)

ECMAScript6 | 特性(部分)