2.暂时性死区
暂时性死区是指只要块级作用域内存在let命令,它所声明的变量就绑定这个作用域,不会受到外部的影响。
var num=12;
if(true){
num=20;
let num;
}
运行之后,在num=20这一行会出现如下错误
从上述代码,显然可以看出,我们用var定义看一个全局变量,但是在if语句中,我们首先修改的变量num的值,然后在块级作用域内le又定义了名也为num的局部变量。导致后者绑定这个块级作用域此,所以在let声明变量前,对num赋值会报错。
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
在ES6规定暂死性区和不存在变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。