美文网首页
块级作用域绑定

块级作用域绑定

作者: 撑船的摆渡人 | 来源:发表于2019-11-22 11:50 被阅读0次

    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。这样可以在某种程度上实现代码的不可变,从而防止某些错误的产生。

    相关文章

      网友评论

          本文标题:块级作用域绑定

          本文链接:https://www.haomeiwen.com/subject/lvsfwctx.html