es6关于暂时性死区的疑问
正在学习ES6的内容,看的是阮一峰老师出的书,看到变量声明那里,关于暂时性死区的内容。这里有一个例子:
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError:tmp is not defined
let tmp;
}
看完对这个例子的解析,还是没有解决我的疑问。我不把let的声明放到代码块前面。
我是这么看这个例子的:首先,因为代码中没有函数,所以声明了一个全局的变量tmp并且初始化一个值123。然后进入条件语句之后,再给这个全局变量重新赋值,接着后面声明了一个只在花括号内有效的和全局变量同名的一个变量。最后报错。tmp没有定义,可是明明已经全局声明过tmp了,所以这么报错是因为和局部的块作用域的tmp冲突了。
然后改下代码,换了let变量名:
var tmp = 123;
if (true) {
tmp = 'abc';
let temp;
}
// 输出 abc 这来自全局tmp
没有报错,并且输出abc,块作用域的temp不受影响
结论是,代码块内不能声明和全局变量同名的变量?这显然不应该是这样的,有点理不清了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到var声明),要么将声明放到TDZ中(遇到let和const声明),访问TDZ中的变量会触发运行时错误。只要执行过变量声明语句后,变量才会从TDZ中移除,然后方可正常访问。
当访问if里的tmp时,访问的是TDZ中的tmp,而不是全局的tmp。
你这个在思考问题的时候显然没有用到任何TDZ的概念啊!你在看TDZ,但是还是按照你自己原先的理解去思考问题,那还怎么学习?干脆自己出本书吧,就叫《我理解的javascript》
只要块级作用域存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。
在代码块内,使用let声明变量之前,该变量都是不可用的。在语法上,称为“暂时性死区”。(temporal dead zone)
ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。