块级作用域绑定

var声明及变量提升(Hoisting)机制

在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升(Hoisting)机制

块级声明

块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域(亦被称为词法作用域)存在于:

  • 函数内部
  • 块中(字符{和}之间的区域)

① let 声明

let 声明的用法与 var 相同。

  1. let可以把变量的作用域限制在当前代码块中(临时死区(Temporal Distortion Zone))
  2. 禁止重复声明

② const 声明

const 声明的是常量,其值一旦设置不可更改。因此,每个通过 const 声明的常量必须进行初始化。

常量的定义最好使用全大写标识,例如:CONST

不可以为 const 定义的常量再赋值,否则会抛出错误

与其他语言不同的是,常量如果是对象,则对象中的值可以修改。
const 声明不允许修改绑定,但允许修改值。

临时死区(TDZ)

let和const声明的变量不会被提升到作用域的顶部,如果在声明之前访问这些变量,即使是相对安全的 typeof 操作符也会触发引用错误。

JavaScript引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(遇到 var 声明),要么将声明放到 TDZ 中(遇到 let 和 const 声明)。访问 TDZ 中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从 TDZ 中移出,然后方可正常访问。

如果在代码块外执行访问定义的变量时,value 并不在 TDZ 中,只是不存在 value这个绑定。TDZ 只是块级绑定的特色之一。

全局块作用域绑定

当 var 被用于全局作用域时,它会创建一个新的全局变量作为全局对象(浏览器环境中的 window 对象)的属性。
let 或 const 会在全局作用域下创建一个新的绑定,不会添加为全局对象的属性,只能遮蔽它。

小结

let 和 const 为JavaScript 引入了词法作用域,它们声明的变量不会提升,而且只可以在声明这些变量的代码块中使用。大幅降低了产生错误的几率,只是不能在声明前访问。

最佳实践:默认使用 const,只在确实需要改变变量的值时使用 let。这样可以在某种程度上实现代码的不可变,从而防止某些错误的产生。

你可能感兴趣的:(块级作用域绑定)