1. 变量提升: 声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)。
2. 块级声明:也就是让所声明的变量在指定块的作用域外无法被访问。
3. 块级作用域(又被称为词法作用域)在如下情况被创建:
1>. 在一个函数内部
2>. 在一个代码块(由一对花括号包裹)内部
4. 常量:值在被设置完成后不能再被改变。
一. let VS var
1. let 不会变量提升,var 会;
2. let 块级声明,var 不会;
3. let 禁止重复声明,var 不会;
二. let VS const
1. 两者都不会变量提升;
2. 两者都是块级声明;
3. const 必须在声明时进行初始化;
4. const 声明会在同一作用域(全局或是函数作用域)内定义一个已有变量时会抛出错误,无论是该变量此前是用 var 声明的,还是用 let 声明的。
let 与 const 块级绑定将词法作用域引入了 JS 。这两种声明方式都不会进行提升,并且 只会在声明它们的代码块内部存在。由于变量能够在必要位置被准确声明,其表现更加接近 其他语言,并且能减少无心错误的产生。作为一个副作用,你不能在变量声明位置之前访问 它们,即便使用的是 typeof 这样的安全运算符。由于块级绑定存在暂时性死区(temporal dead zone), 试图在声明位置之前访问它就会导致错误。
let 与 const 的表现在很多情况下都相似于 var ,然而在循环中就不是这样。在 for-in 与 for-of 循环中, let 与 const 都能在每一次迭代时创建一个新的绑定,这意味着在循 环体内创建的函数可以使用当前迭代所绑定的循环变量值(而不是像使用 var 那样,统一使 用循环结束时的变量值)。这一点在 for 循环中使用 let 声明时也成立,不过在 for 循 环中使用 const 声明则会导致错误。
块级绑定当前的最佳实践就是:在默认情况下使用 const ,而只在你知道变量值需要被更改 的情况下才使用 let 。这在代码中能确保基本层次的不可变性,有助于防止某些类型的错 误。