var 声明与变量提升
块级声明
块级声明也就是让所声明的变量在指定块的作用域外无法被访问。
1. 在一个函数内部
2. 在一个代码块(由一对花括号包裹)
let 声明
let 声明的语法与 var 的语法一致。但会将变量的作用域限制在当前代码块中。由于 let 声明并不会被提升到当前代码块的顶部,因此需要手动将 let 声明放置到顶部,以便让变量在整个代码块内部可用。
禁止重复声明
如果一个标识符已经在代码块内部被定义,那么在此代码块内使用同一个标识符进行 let 声明就会导致抛出错误。
常量声明
在 ES6 中里也可以使用 const 语法进行声明。使用 const 声明的变量会被认为是常量(constant ),意味着它们的值在被设置完成后就不能再被改变。正因为如此,所有的 const变量都需要在声明时进行初始化。
对比常量声明与 let 声明: 常量声明与 let 声明一样,都是块级声明。这意味着常量在声明它们的语句块外部是无法访问的,并且声明也不会被提升。
使用 const 声明对象: const 声明会阻止对于变量绑定与变量自身值的修改,这意味着 const 声明并不会阻止对变量成员的修改。
暂时性死区
暂时性死区( temporal dead zone , TDZ )。该名称并未在 ECMAScript 规范中被明确命名,但经常被用于描述 let 或 const 声明的变量在声明处之前无法被访问的原因。
当 JS 引擎检视接下来的代码块并发现变量声明时,它会在面对 var 的情况下将声明提升到函数或全局作用域的顶部,而面对 let 或 const 时会将声明放在暂时性死区内。任何在暂时性死区内访问变量的企图都会导致“运行时”错误(runtime error)。只有执行到变量的声明语句时,该变量才会从暂时性死区内被移除并可以安全使用。
循环中的块级绑定
开发者最需要使用变量的块级作用域的场景,或许就是在 for 循环内,也就是想让一次性的循环计数器仅能在循环内部使用。
循环内的函数
循环内的 let 声明
循环内的常量声明
全局块级绑定
let 与 const 不同于 var 的另一个方面是在全局作用域上的表现。当在全局作用域上使用 var 时,它会创建一个新的全局变量,并成为全局对象(在浏览器中是 window )的一个属性。然而若你在全局作用域上使用 let 或 const ,虽然在全局作用域上会创建新的绑定,但不会有任何属性被添加到全局对象上。这也就意味着你不能使用 let 或 const 来覆盖一个全局变量,你只能将其屏蔽。
块级绑定新的最佳实践
在默认情况下使用 const ,而只在你知道变量值需要被更改的情况下才使用 let 。这在代码中能确保基本层次的不可变性,有助于防止某些类型的错误。