JavaScript执行上下文是引擎真实创建的执行环境,分全局、函数、eval三类,经历创建(初始化VO、作用域链、this)和执行(赋值、调用)两阶段,由调用栈LIFO管理。

JavaScript 执行上下文是理解代码运行机制的核心,也是前端面试高频考点。它不是语法糖,而是引擎真实创建和管理的执行环境,直接决定变量提升、this指向、作用域查找等行为。
执行上下文的三种类型
JavaScript 运行时只存在三类执行上下文:
-
全局执行上下文:脚本加载时自动创建,且仅有一个。在浏览器中绑定
this到window,初始化全局对象、变量和函数声明。 -
函数执行上下文:每次函数被调用时新建一个。包含参数、
arguments(函数内)、this、以及独立的作用域链。函数返回后该上下文被销毁(闭包例外)。 -
Eval 执行上下文:由
eval()执行字符串代码时创建。因安全与性能问题,生产环境禁用,面试中只需知道存在,不需深究。
执行上下文的两个阶段
每个上下文从诞生到回收,严格分为创建阶段和执行阶段:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
创建阶段(代码执行前):
– 初始化arguments对象(仅函数上下文);
– 处理函数声明:函数名作为属性写入变量对象(VO),值为函数体地址(可提升);
– 处理var声明:变量名写入 VO,初始值为undefined(变量提升);
– 确定this值(全局为window,普通函数调用为undefined(严格模式)或window(非严格));
– 构建作用域链(当前 VO + 所有父级 VO 链式连接)。 -
执行阶段(代码逐行运行):
– 变量真正赋值(如a = 123);
– 函数调用触发新上下文压栈;
–console.log、运算等实际操作发生在此阶段。
执行上下文栈(调用栈)工作规则
这是一个后进先出(LIFO)的栈结构,全程由 JS 引擎自动维护:
立即学习“Java免费学习笔记(深入)”;
- 页面启动 → 全局上下文入栈(栈底);
- 函数被调用 → 新函数上下文压入栈顶;
- 函数执行完毕 → 栈顶上下文立即弹出;
- 所有函数返回 → 全局上下文最后弹出,程序结束。
- 报错时,控制台显示的
at xxx就是当前栈中各上下文的调用顺序,从上到下即从栈顶到栈底。
常见陷阱与面试真题解析
以下三类题型几乎必考,关键在分清“声明”和“赋值”、“函数声明”和“函数表达式”、“VO 初始化”和“执行时求值”:
-
变量/函数提升顺序题:
如console.log(a); var a = 1; function a() {}输出function a(){}—— 因为函数声明优先于var声明写入 VO,而console.log查的是 VO 中已存在的函数。 -
this 绑定判断题:
区分调用方式:obj.fn()→this是obj;const f = obj.fn; f()→this是undefined(严格)或window(非严格);箭头函数无自身this,继承外层。 -
嵌套调用执行顺序题:
如first()内调second(),输出顺序严格按“入栈→执行→出栈”流程,栈顶永远是正在执行的函数。

















