javascript执行上下文分三阶段:创建阶段建立词法/变量环境并确定this;初始化阶段为var/let/const赋初始值;执行阶段逐行运行代码。

JavaScript 执行上下文(Execution Context)是理解代码如何运行的核心机制。它不是抽象概念,而是 JS 引擎在执行函数或全局代码前真实创建的一个内部结构,整个过程严格分为三个阶段:创建阶段(Creation Phase)→ 初始化变量与函数 → 执行阶段(Execution Phase)。跳过任一阶段,就无法正确解释变量提升(hoisting)、this 绑定、作用域链形成等行为。
第一阶段:创建执行上下文(Creation Phase)
每当一段可执行代码(全局代码、函数调用、eval)开始运行,JS 引擎先不执行任何语句,而是同步完成三件事:
-
建立词法环境(LexicalEnvironment):包含当前作用域中所有
let/const声明(初始化为uninitialized),以及函数声明(直接绑定到环境记录中); -
建立变量环境(VariableEnvironment):专门处理
var声明(初始化为undefined),也包含函数声明(与词法环境重复,但历史原因保留); -
确定
this值:全局上下文中为全局对象(浏览器中是window),普通函数调用中为undefined(严格模式)或全局对象(非严格),箭头函数则继承外层this。
注意:此时所有 var 已存在但值为 undefined,let/const 存在但不可访问(进入“暂时性死区”),函数声明已就绪可调用。
第二阶段:初始化绑定(Binding Initialization)
该阶段隐含在创建阶段内,但逻辑上紧随其后,是变量真正获得初始值的时刻:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
var a = 10→ 在变量环境中将a的值从undefined更新为10; -
let b = 20或const c = 30→ 在词法环境中将b/c从uninitialized状态设为对应值; -
function foo() {}→ 函数对象已在创建阶段绑定,此处不重复赋值; -
const d = getValue()→getValue()此时才被调用(即执行阶段才求值),但绑定动作发生在初始化阶段末尾。
第三阶段:执行代码(Execution Phase)
引擎逐行执行代码,按顺序更新变量、调用函数、计算表达式。关键点:
- 遇到
var重新赋值(如a = 42),直接修改变量环境中的值; - 遇到
let/const赋值(b = 50),更新词法环境记录; - 每次函数调用都会触发新执行上下文的完整三阶段流程(包括自己的创建、初始化、执行);
- 执行中若遇到嵌套函数定义,该函数对象被创建并保存在当前词法环境中,但不会立即执行。
一个直观示例拆解
以这段代码为例:
function test() {console.log(a); // undefined
console.log(b); // ReferenceError
var a = 1;
let b = 2;
}
进入 test 时:
- 创建阶段:词法环境加入
b: uninitialized,变量环境加入a: undefined,函数声明无; - 执行阶段第 1 行:
console.log(a)→ 读取变量环境中的a,输出undefined; - 执行阶段第 2 行:
console.log(b)→ 尝试读取未初始化的b→ 抛出ReferenceError; - 后续赋值语句才真正写入值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










