JavaScript执行上下文栈按后进先出(LIFO)管理:全局执行上下文在脚本启动时创建,函数调用时新建函数执行上下文并压栈,执行完毕立即弹出;eval上下文已不推荐。栈顶始终为当前执行上下文,嵌套过深触发RangeError;异步回调由Event Loop在同步任务清空后推入;每个上下文含词法环境、变量环境、this绑定与作用域链,创建时初始化,执行时使用。

JavaScript 执行上下文栈(Call Stack)用后进先出(LIFO)的方式管理代码运行流程:函数调用时推入,执行完立即弹出,确保当前正在运行的执行上下文始终在栈顶。
执行上下文的创建时机
执行上下文不是凭空出现的,它只在三种明确场景下被创建:
- 全局代码开始执行时 → 创建全局执行上下文(整个脚本生命周期内唯一一个)
- 每次函数被调用时 → 创建对应的函数执行上下文(每次调用都新建,互不共享)
- 使用 eval() 执行字符串代码时 → 创建临时的 eval 执行上下文(已不推荐使用)
调用栈的压入与弹出过程
每一步都严格对应函数控制流的实际转移:
- 遇到 func() 调用时,引擎暂停当前上下文,为 func 创建新上下文,并压入栈顶
- 若 func 内部又调用 inner(),则继续压入 inner 的上下文
- 函数体执行完毕(遇到 return、自然结束或抛错),其上下文立即从栈顶弹出
- 控制权交还给栈中下一个(即原调用者)上下文,继续执行后续语句
栈结构如何保障执行顺序
调用栈本身不决定“该不该执行”,而是忠实反映“正在哪一层执行”:
立即学习“Java免费学习笔记(深入)”;
- 栈底永远是全局上下文,代表最外层作用域和初始执行环境
- 栈顶永远是当前正在执行代码的上下文,JS 引擎只处理栈顶上下文中的语句
- 嵌套调用越深,栈越高;递归过深会触发 RangeError: Maximum call stack size exceeded
- 异步回调(如 setTimeout 回调)不会直接入栈,而是等同步任务清空 Call Stack 后,由 Event Loop 推入
和变量环境、this、作用域链的关系
每个执行上下文内部包含三类关键数据,它们在上下文创建阶段就初始化完成:
- 词法环境(LexicalEnvironment):保存 let/const 声明及块级作用域信息
- 变量环境(VariableEnvironment):保存 var 声明(含变量提升逻辑)
- this 绑定与作用域链:根据调用方式确定 this 指向,并链接外层词法环境形成作用域链
这些内容在“执行阶段”才被实际读取或修改,但结构已在上下文创建时固化。


















