事件循环(Event Loop)到底是什么?
事件循环(Event Loop)到底是什么?
JavaScript 是单线程语言,但它的异步能力一点都不弱,秘密就藏在事件循环里。
1. 先看一段代码
console.log('1')
setTimeout(() => {
console.log('2')
}, 0)
Promise.resolve().then(() => {
console.log('3')
})
console.log('4')
输出顺序是 1 4 3 2。要理解它,需要知道两个队列:
- 宏任务队列(macrotask):
setTimeout、setInterval、I/O 回调 - 微任务队列(microtask):
Promise.then、queueMicrotask、MutationObserver
2. 事件循环的执行顺序
- 执行同步代码(调用栈)
- 调用栈清空后,清空所有微任务
- 取一个宏任务执行
- 再次清空微任务,如此往复
所以上面的例子里,Promise.then(微任务)永远比 setTimeout(宏任务)先执行,哪怕延时写的是 0。
3. 在 Node.js 中
Node.js 的事件循环由 libuv 提供,分为 timers、poll、check 等阶段。每个阶段切换之间同样会清空微任务:
setTimeout(() => console.log('timer'), 0)
setImmediate(() => console.log('immediate'))
Promise.resolve().then(() => console.log('promise'))
记住一句话:同步代码 → 微任务 → 宏任务,绝大多数面试题都能拿下。
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~