什么是事件循环?
事件循环(Event Loop)是现代ja
事件循环的基本原理
事件循环遵循以下基本工作流程:
1. 执行调用栈:从调用栈顶部开始执行函数
2. 处理微任务:当调用栈为空时,处理所有微任务(Microtasks)
3. 渲染更新:浏览器环境下可能执行UI渲染
4. 处理宏任务:从任务队列(Macrotask Queue)中取出一个任务执行
5. 循环重复:重复上述过程
宏任务 vs 微任务
宏任务(Macrotasks)
- setTimeout/setInterval
- I/O操作
- UI渲染
- setImmediate(Node.js)
- requestAnimationfr
微任务(Microtasks)
- Promise.then/catch/finally
- MutationObserver
- process.nextTick(Node.js)
面试常见问题解析
问题1:以下代码的输出顺序是什么?
ja
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');
答案:1, 4, 3, 2
解析:
1. 同步代码先执行,输出1和4
2. 微任务(Promise)优先于宏任务(setTimeout)执行,输出3
3. 最后执行宏任务,输出2
问题2:Node.js与浏览器的事件循环有何不同?
关键区别:
1. 阶段划分:Node.js的事件循环分为多个阶段(timers、pending callbacks、idle/prepare、poll、check、close callbacks)
2. process.nextTick:Node.js特有的微任务,优先级高于Promise
3. setImmediate:Node.js特有的宏任务,在check阶段执行
4. 执行时机:浏览器每执行一个宏任务后就会检查微任务队列,而Node.js是在阶段之间处理微任务
事件循环的应用场景
1. 异步编程:理解事件循环有助于编写高效的异步代码
2. 性能优化:避免长时间阻塞事件循环
3. 动画处理:合理使用requestAnimationfr
4. 服务端开发:Node.js中处理高并发I/O
面试准备建议
1. 手写事件循环执行顺序的代码示例
2. 理解Node.js事件循环的各个阶段
3. 掌握process.nextTick与Promise的执行优先级
4. 熟悉浏览器环境下requestAnimationfr
5. 准备实际项目中如何利用事件循环优化性能的案例
总结
事件循环是ja