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 是单线程的 所以 运行栈只有一个,不能同时运行两个函数。

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