函数调用栈
一句话结论:调用栈决定“同步代码必须一次性跑完”;事件循环只能在栈清空时才能把异步回调取出来执行。
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是同步执行的