// 会报错: inner is not defined// console.log(inner) {// 会报错: Cannot access 'inner' before initialization// console.log(inner)// 使用let声明的,不能被提升到代码块外部,因此它的作用域只限于当前代码块内// 此时变量处于【临时死区(TDZ)】// 使用let或者const声明的变量在声明之前会被放到TDZ中,若访问这些变量就会触发运行时错误let inner =true
console.log(inner)}// console.log(inner)
我们可以将下面的代码转为 es5 ,看看编译成es5后到底是怎么样的
let a =100;{
console.log(a)// 报错,这里涉及到一个概念。即【暂时性死区”(temporal dead zone,简称 TDZ)】,其意思就是只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。// 下方使用了let声明,即 a 已经被绑定在该作用域了,上面打印时候发现当前的作用域有 a,那么也就不会往外层作用域找,并且使用let声明的变量不会导致变量提升,因此就报错了。let a =1}
let不允许重复声明
注意:对于这一特性,有一个前置条件,那就是只有在相同的作用域时,才不允许同一个变量重复声明
var duplicate
let repeat
var duplicate
// 报错:Identifier 'repeat' has already been declared// let repeat {// 属于不同的作用域,因此可以正常声明let repeat
}