Blog icon indicating copy to clipboard operation
Blog copied to clipboard

作用域与闭包 - JavaScript的作用域和作用域链

Open logan70 opened this issue 5 years ago • 0 comments

JavaScript的作用域和作用域链

ES6之后作用域概念变为词法环境概念,标准定义详见 ECMAScript#Lexical Environment

词法环境(Lexical Environment)

词法环境由以下两部分组成:

  • 环境记录(Environment Record):记录相应代码块的标识符绑定,可理解为代码块内变量、函数等都绑定于此;
  • 对外部词法环境的引用(outer):用于形成多个词法环境在逻辑上的嵌套结构,以实现可以访问外部词法环境变量的能力。

作用域链

上一点所有的词法环境中的 对外部词法环境的引用(outer),可以实现内部词法环境访问外部词法环境,从而实现了一个嵌套结构,即所说的 作用域链

词法环境在ECMAScript定义中,也是构成 执行上下文 的一部分。众所周知执行上下文在函数执行时才会创建,那么为什么又说JS的作用域是静态作用域呢,下面一起来看一下:

  1. JS在定义函数时不仅会记录函数代码、形参等信息,还会将函数被定义时所处的词法环境记录下来;

    此处可参考 ECMAScript#functioninitialize

  2. 执行函数时创建执行上下文、创建词法环境(包括环境记录和外部引用),并将外部引用指向第一点中记录的函数被定义时所处的词法环境。

    此处可参考 ECMAScript#newfunctionenvironment

JavaScript通过上述步骤实现了动态创建函数执行上下文时,对外部词法环境的引用是该函数定义时所在的词法环境,从而实现了静态作用域。

logan70 avatar Nov 25 '19 06:11 logan70