猿问

如何理解es6关于暂时性死区的问题

正在学习ES6的内容,看的是阮一峰老师出的书,看到变量声明那里,关于暂时性死区的内容。这里有一个例子:vartmp=123;if(true){tmp='abc';//ReferenceError:tmpisnotdefinedlettmp;}看完对这个例子的解析,还是没有解决我的疑问。我不把let的声明放到代码块前面。我是这么看这个例子的:首先,因为代码中没有函数,所以声明了一个全局的变量tmp并且初始化一个值123。然后进入条件语句之后,再给这个全局变量重新赋值,接着后面声明了一个只在花括号内有效的和全局变量同名的一个变量。最后报错。tmp没有定义,可是明明已经全局声明过tmp了,所以这么报错是因为和局部的块作用域的tmp冲突了。然后改下代码,换了let变量名:vartmp=123;if(true){tmp='abc';lettemp;}//输出abc这来自全局tmp没有报错,并且输出abc,块作用域的temp不受影响结论是,代码块内不能声明和全局变量同名的变量?这显然不应该是这样的,有点理不清了。
胡子哥哥
浏览 555回答 2
2回答

九州编程

JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到var声明),要么将声明放到TDZ中(遇到let和const声明),访问TDZ中的变量会触发运行时错误。只要执行过变量声明语句后,变量才会从TDZ中移除,然后方可正常访问。vartmp=123;if(true){tmp='abc';//ReferenceError:tmpisnotdefinedlettmp;}当访问if里的tmp时,访问的是TDZ中的tmp,而不是全局的tmp。

宝慕林4294392

只要块级作用域里存在let命令,它所声明的变量就绑定这个区域,不在受外部的影响let 和 const 声明的变量不会被提升到作用域顶部,如果在声明之前访问这些变量,会导致报错:   console.log(typeof value); // Uncaught ReferenceError: value is not defined    let value = 1;复制代码这是因为 JavaScript 引擎在扫描代码发现变量声明时,要么将它们提升到作用域顶部(遇到 var 声明),要么将声明放在 TDZ 中(遇到 let 和 const 声明)。访问 TDZ 中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从 TDZ 中移出,然后方可访问。function show(falg){                          // JavaScript引擎在扫描代码发现变量      TDZ暂时性死区(有let申明)console.log(a);//报错: a is not defined               //a                                放入(未申明引用报错)            if(falg){//在第134行和第137行的大括号之间,         let a="111";                                 //a="111"         console.log(a); // 111                       //a                                移除(已申明引用移除)     }else{        console.log(a);//报错: a is not defined       //a                                放入(未申明引用报错)     }      } show(true); show(false);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答