嵌套块将创建一个新的块作用域的词法环境。内部a变量在该范围内声明,但在初始化之前访问,因此出现错误。内部作用域let a声明覆盖了var a声明,因此它是一个不同的变量,就好像您这样写:var a = 6;{ console.log(a2) let a2 =55 }
为了补充上述两个答案,该语句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已经声明但还没有赋值。