ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明

不存在变量提升

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined

let命令不存在变量提升的行为,它所声明的变量一定要在声明后使用,否则报错。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明


暂时性死区

只要块级作用域内存在let命令声明变量之前,该变量都是不可用的。

这在语法上,称为“暂时性死区” temporal dead zone,简称 TDZ。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明


有些“死区”比较隐蔽,不太容易发现。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明

上面代码中,调用foo函数之所以报错(某些实现可能不报错),是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。如果y的默认值是x,就不会报错,因为此时x已经声明了。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明

另外,下面的代码也会报错,与var的行为不同。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明

上面代码报错,也是因为暂时性死区。使用let声明变量时,只要变量在还没有声明完成前使用,就会报错。上面这行就属于这个情况,在变量x的声明语句还没有执行完成前,就去取x的值,导致报错”x 未定义“。


不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明

因此,不能在函数内部重新声明参数。

例:

ES6基础入门-03.let命令的特性——不存在变量提升,暂时性死区,不允许重复声明