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

块级作用域绑定

作者: 撑船的摆渡人 | 来源:发表于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。这样可以在某种程度上实现代码的不可变,从而防止某些错误的产生。

相关文章

  • 块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在...

  • 块级作用域绑定

    在函数作用域或全局作用域中通过关键字var声明变量,但是无论在哪里声明,都会被当成在当前作用域顶部声明的变量,这就...

  • 深入理解ES6(2)

    第1章 块级作用域绑定 1. var声明及变量提升(Hoisting)机制 基于js原生是没有块级作用域的,看下面...

  • 《深入理解ES6》学习笔记(第三天)

    《深入理解ES6》学习笔记(第三天) 第一章 块级作用域绑定 第2节 块级声明块级声明用于声明在指定块的作用域之外...

  • js 作用域

    js 作用域主要有:全局作用域和局部作用域,es5之前没有块级作用域,es6有了块级作用域 何为块级作用域,块级作...

  • let、const和var的区别(个人笔记)

    1. 区别 (1)块级作用域块作用域由{ }包括,let和const具有块级作用域,var不存在块级作用域。块级作...

  • 一、块级绑定

    ES2015 一、块级绑定 1、let、const和块级作用域 var 变量提升(hoisting )   使用v...

  • 读《深入理解ES6》

    第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...

  • 一、块级作用域绑定

    var声明及变量提升机制 在预编译阶段js引擎会将上面函数修改成下面这样 块级声明 临时死区(TDZ) //循环中...

  • let,var和const

    var没有块级作用域,只有方法作用域常见的块级作用域,if(){}。for(){}。

网友评论

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

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