Skip to content

什么是运行栈

运行栈,也叫 调用栈(Call Stack)执行上下文栈

运行栈是JS引擎迎来管理函数调用顺序的一块内存结构

遵循先进后出的规则

最后调用的函数,最先执行完并退出

运行栈中存的是什么

每当 JS 执行一段代码(脚本或函数),引擎都会创建一个 执行上下文,里面包含:变量环境、词法环境、this绑定、外部环境引用

这些上下文对象会依次压入 运行栈

执行过程举例

一个简单例子

js
function a() {
  console.log('a start')
  b()
  console.log('a end')
}

function b() {
  console.log('b')
}

a()

执行过程:

  1. 开始执行全局代码

    • JS 会创建一个 全局执行上下文(Global Execution Context)

    • 把它 压入运行栈

    • 现在运行栈是:

      [ Global ]
  2. 调用函数 a()

    • 创建 a 的执行上下文

    • 压入运行栈

      [ a, Global ]
  3. 执行 a 内部的 b()

    • 创建 b 的执行上下文

    • 压入运行栈

      [ b, a, Global ]
  4. b 执行完毕

    • b 的上下文从栈顶弹出

      [ a, Global ]
  5. a 执行完毕

    • 弹出 a

      [ Global ]
  6. 程序执行完毕

    • 全局上下文也出栈

      []

运行栈与异步的关系

JS 是单线程的 所以 运行栈只有一个,不能同时运行两个函数。

当遇到异步操作(如 setTimeoutPromise)时,JS 会把它们交给 事件循环,由事件循环调度异步任务,等待当前运行栈清空后,再将回调函数压入栈执行。