闭包是一个绑定了执行环境的函数,闭包与普通函数的区别是,闭包携带了执行的环境。JS 中闭包的组成为:
- 环境部分
- 环境:函数的词法环境(执行上下文的一部分,即词法环境)
- 标识符变量:函数中用到的未声明的变量
- 表达式:函数体
闭包环境部分中的环境其实是词法环境,词法环境是 JS 执行上下文中的一部分。
那什么是执行上下文呢?JS 标准中,把一段代码(包括函数),执行所需的所有信息定义为执行上下文。
具体在 ES2018 中,执行上下文分为:
- Lexical environment:词法环境,读取变量或 this 时使用。
- Variable environment:变量环境,申明变量时使用。
- Code evaluation state:用于恢复代码执行位置。
- Function:执行函数时,表示正在被执行的函数。
- ScriptOrModule:执行的任务是脚本或者模块时,表示正在被执行的代码。
- Realm:使用的基础库和内置对象实例。
- Generator:生成器上下文有该属性,表示当前生成器。