当控制交还给JS可执行代码时,控制将进入执行上下文。活动中的执行上下文做成了一个逻辑上的栈结构。该栈结构的栈顶是当前正在运行的执行环境。每当控制权从当前执行环境所关联的可执行代码转移至不属于当前执行上下文的执行代码时,都会创建新的执行环境。而新创建的执行环境会被压入栈顶,并成为新的当前执行上下文。
执行上下文包含了用来跟踪相关代码执行过程的所有必要状态。另外,每个执行上下文都包含下表中列举的状态组件。
| 组件 | 作用 |
|---|---|
| 词法环境组件 | 记录用于解决执行上下文代码产生的标识符引用的词法作用域 |
| 变量环境组件 | 记录环境中有存在由var声明或function声明所产生的引用的词法作用域 |
| this绑定组件 | 该值和执行上下文的关联代码的this关键字相关联 |
执行上下文的词法环境组件和变量环境组件均为词法环境类型。当一个执行上下文被创建时,它的词法环境组件和变量环境组件将被初始化为相同的值。变量环境组件的值将不会再改变,但是词法环境组件的值将随着执行上下文所对应代码的执行而发生改变。
大多数情况下,在规范的定义范围内,只有当前执行上下文才会进行直接的算法操作。所以当涉及到“词法环境组件”,”变量环境组件“和”this绑定组件“这些术语时, 若不加以限制,可以只当成是当前执行上下文的那些对应组件的引用。
执行上下文实际上纯粹是一种规范机制,并不需要和具体实现的特定概念一一对应。而且在实际程序也没法对执行上下文进行访问。