ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
举个例子,假设我们有如下代码:
console.log(a); // ReferenceError: a is not defined
let a = 10;
在上面的代码中,我们试图在变量 a 声明之前访问变量 a,这会导致 ReferenceError 错误。这是因为在 let 声明 a 变量之前,a 变量并不存在,它处于 "暂时性死区" 中。只有在 a 变量被声明之后,才能正常访问和使用它。
"暂时性死区"是指在一个作用域中,在变量声明之前,该变量是不能被访问或者使用的
“暂时性死区”也意味着typeof不再是一个百分之百安全的操作。
typeof x; // ReferenceError
let x;
上面代码中,变量x使用let命令声明,所以在声明之前,都属于x的“死区”,只要用到该变量就会报错。因此,typeof运行时就会抛出一个ReferenceError。