var声明及变量提升(Hoisting)机制
在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升(Hoisting)机制
块级声明
块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域(亦被称为词法作用域)存在于:
- 函数内部
- 块中(字符{和}之间的区域)
① let 声明
let 声明的用法与 var 相同。
- let可以把变量的作用域限制在当前代码块中(临时死区(Temporal Distortion Zone))
- 禁止重复声明
② 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 引入了词法作用域,它们声明的变量不会提升,而且只可以在声明这些变量的代码块中使用。大幅降低了产生错误的几率,只是不能在声明前访问。
网友评论