Blog
Blog copied to clipboard
作用域与闭包 - JavaScript的作用域和作用域链
JavaScript的作用域和作用域链
ES6之后作用域概念变为词法环境概念,标准定义详见 ECMAScript#Lexical Environment
词法环境(Lexical Environment)
词法环境由以下两部分组成:
- 环境记录(Environment Record):记录相应代码块的标识符绑定,可理解为代码块内变量、函数等都绑定于此;
- 对外部词法环境的引用(outer):用于形成多个词法环境在逻辑上的嵌套结构,以实现可以访问外部词法环境变量的能力。
作用域链
上一点所有的词法环境中的 对外部词法环境的引用(outer),可以实现内部词法环境访问外部词法环境,从而实现了一个嵌套结构,即所说的 作用域链。
词法环境在ECMAScript定义中,也是构成 执行上下文 的一部分。众所周知执行上下文在函数执行时才会创建,那么为什么又说JS的作用域是静态作用域呢,下面一起来看一下:
- JS在定义函数时不仅会记录函数代码、形参等信息,还会将函数被定义时所处的词法环境记录下来;
- 执行函数时创建执行上下文、创建词法环境(包括环境记录和外部引用),并将外部引用指向第一点中记录的函数被定义时所处的词法环境。
JavaScript通过上述步骤实现了动态创建函数执行上下文时,对外部词法环境的引用是该函数定义时所在的词法环境,从而实现了静态作用域。