作用域与词法环境

作用域

作用域(Scope)是指程序源代码中定义变量或函数的区域,决定了它们的可被访问的范围

作用域是当前的执行上下文,和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。作用域也可以堆叠成层次结构,子作用域可以访问父作用域,反过来则不行。 letconst 声明的变量属于块级作用域。

词法环境

在 JavaScript 中,每个运行的函数,代码块{...}以及整个脚本,都有一个被称为**词法环境(Lexical Environment)**的内部(隐藏)的关联对象。

词法环境对象由两部分组成:

  1. 环境记录(Environment Record)—— 一个存储所有局部变量作为其属性(包括一些其他信息,例如this的值)的对象。
  2. 外部词法环境的引用,与外部代码相关联。 一个“变量”只是环境记录这个特殊的内部对象的一个属性。“获取或修改变量”意味着“获取或修改词法环境的一个属性”。

作用域链

当需要解析某个变量或函数时,解释器会首先在当前的词法环境中查找,如果没有找到,则会沿着外部环境引用一级级向上查找,直到找到该变量或函数,或者抵达了全局词法环境。这个查找过程就构成了作用域链(Scope Chain)。

因此,作用域确定了变量和函数的可被访问范围,而词法环境则是存储和解析它们的数据结构。一个特定的作用域对应了一个词法环境。词法环境通过外部环境引用把内部作用域和外部作用域连接起来,形成了作用域链,从而实现了作用域的工作机制。