为了账号安全,请及时绑定邮箱和手机立即绑定

如果 let 没有被提升或者它们进入了临时死区,那么为什么这个片段会抛出错误,而它本可以使用全局引用

如果 let 没有被提升或者它们进入了临时死区,那么为什么这个片段会抛出错误,而它本可以使用全局引用

心有法竹 2023-04-27 16:23:12
var a = 6;{  console.log(a)  let a =55  } 当我执行此代码段时,出现以下错误消息:ReferenceError: Cannot access 'a' before initialization为什么 console.log(a) 没有给出 6 作为结果。
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您的问题的答案在您的标题中:变量位于“时间死区”中,这只是您所看到的行为的名称。

与以varundefined 开头的变量声明的变量不同,let变量在其定义被评估之前不会被初始化。在初始化之前访问变量会导致ReferenceError. 从块的开始到处理初始化,变量都处于“时间死区”。

块的开始是开头{和你的console.log(a)comes beforelet语句,所以它在这个“死区”。

为什么会这样?因为它可以帮助程序员检测由于在不同范围内具有相同名称的变量之间的混淆而导致的代码错误。


查看完整回答
反对 回复 2023-04-27
?
POPMUISE

TA贡献1765条经验 获得超5个赞

嵌套块将创建一个新的块作用域词法环境。


内部a变量在该范围内声明,但在初始化之前访问,因此出现错误。


内部范围let a声明覆盖了var a声明,所以它是一个不同的变量,就像你这样写一样:


var a = 6;

{

  console.log(a2)

  let a2 =55

  


查看完整回答
反对 回复 2023-04-27
?
哔哔one

TA贡献1854条经验 获得超8个赞

除了上述两个答案之外,该语句let a = 55实际上是两个语句合二为一:let a- 声明 - 和a = 55- 赋值。由于 Javascript 的提升规则,声明在进入块时处理,但赋值保留其词法位置。


所以块:


var a = 6

{

  console.log(a)

  let a = 55

在语义上等同于:


var a = 6

{

    let a

    console.log(a)

    a = 55

}

因为局部声明a屏蔽了同名的全局变量,到console.log(a)执行时a已经声明但还没有赋值。


查看完整回答
反对 回复 2023-04-27
  • 3 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信