Notes

函数调用栈

一句话结论:调用栈决定“同步代码必须一次性跑完”;事件循环只能在栈清空时才能把异步回调取出来执行。

1. 调用栈是什么

  • JS 执行函数时会创建执行上下文并压栈,返回后出栈
  • 栈只反映“当前同步调用链”,不会包含未来要执行的异步回调
  • 栈深过大(递归/循环调用)会导致 Maximum call stack size exceeded

2. 它与事件循环的关系

  • 同步代码占用栈 → 队列里的回调只能等待
  • “异步”本质:把回调放到队列里,等栈空再执行
console.log(1);
setTimeout(() => console.log(3), 0);
Promise.resolve().then(() => console.log(2));
console.log(4);
// 常见结果:1 4 2 3

3. 常见误区

  • “0ms 定时器立刻执行”:不对,至少要等当前栈清空 + 排队
  • “Promise 是异步的”:不完全,new Promise(fn)fn 是同步执行的

关联阅读

cd ..