“执行上下文栈”和“调用栈”是同一栈结构的两种称谓:前者侧重规范中管理执行上下文(含词法环境、变量环境、this等)的语义,后者强调函数调用/返回的控制流过程,实际调试中看到的Call Stack面板展示的正是该栈。

JavaScript 中的“执行上下文栈”和“调用栈”本质上是同一个栈结构,没有功能或实现上的区别,只是术语侧重点不同。
叫法来源不同
“调用栈”(Call Stack)是从运行机制角度命名的:强调函数被调用时入栈、返回时出栈的过程,关注的是控制流顺序和嵌套关系。
“执行上下文栈”(Execution Context Stack)是从规范与数据内容角度命名的:ECMAScript 标准中明确定义该栈用于管理各类执行上下文(全局、函数、eval),栈中每一帧存储的是完整的执行环境信息。
栈中存的内容是一样的
无论叫哪个名字,栈里压入的都是执行上下文对象,每个上下文包含:
立即学习“Java免费学习笔记(深入)”;
- 词法环境(LexicalEnvironment),用于变量查找和作用域链
- 变量环境(VariableEnvironment),处理 var 声明和函数提升
- this 值
- 代码执行状态(如当前执行到哪一行)
函数调用时压入的,就是它的函数执行上下文;脚本启动时压入的,是全局执行上下文。不存在“只存调用信息却不含上下文”的情况。
实际调试中看到的也是同一个东西
在浏览器开发者工具的 Call Stack 面板里,你看到的每一层名称(如 foo、bar、<anonymous>)对应的就是正在运行的函数执行上下文。点击某一层,能查看其作用域(Scope)、闭包(Closure)、this 值等——这些全是执行上下文的组成部分。
也就是说,调试器展示的“调用栈”,底层就是引擎维护的“执行上下文栈”,二者不是并存的两个栈,而是同一数据结构的两种说法。
不复杂但容易忽略


















