执行上下文与词法环境
词法环境由什么组成?
- 语义: 定义标识符与变量、函数等绑定关系的结构;
- 组成: Environment Record (保存绑定)、
outer(指向外层词法环境)、this(该环境绑定的 this); - Environment Record 分类:
- Declarative Environment Record: 函数环境记录与模块环境记录属于此类;
- Object Environment Record: 由
with创建的记录; - Global Environment Record: 全局上下文使用;
this 在各类上下文中如何确定?
- 全局上下文: 严格模式为
undefined, 非严格模式为全局对象; - 普通函数: 由调用点决定, 见 this 绑定;
- 箭头函数: 创建时该环境没有 this 绑定, 沿
outer找到最近的 this;
执行上下文由什么组成?
- LexicalEnvironment: 保存
let/const/function等声明的绑定; - VariableEnvironment: 保存
var声明的绑定; - 类型: 全局执行上下文是默认上下文; 每次调用函数都会新建一个函数执行上下文;
执行栈如何管理上下文?
- 机制: 代码执行期间的上下文保存于栈中;
- 流程: 程序启动时压入全局上下文 → 调用函数时压入新的函数上下文 → 函数返回时弹出栈顶;
- 关联: 上下文的
outer连接关系构成作用域链, 见 作用域与作用域链;

上下文的创建与执行阶段分别做什么?
- 创建阶段: 建立
LexicalEnvironment与VariableEnvironment, 确定 this; 此时var绑定为undefined,let/const为未初始化 (<uninitialized>); - 执行阶段: 逐句执行代码并完成变量赋值;
let a = 20;
const b = 30;
var c;
function multiply(e, f) {
var g = 20;
return e * f * g;
}
c = multiply(20, 30);
执行上下文增强是什么?
- 机制: 特定语句在执行期临时在作用域链前端插入一个上下文, 语句结束后移除;
- 语句:
try...catch的catch块, 以及不推荐的with; with例子: 把对象上下文临时移到函数上下文之前, 因此可以访问函数内变量并在对象上创建属性, 见 跳转语句与 with;