事件循环机制
JavaScript 单线程如何处理异步操作?深入理解事件循环的工作原理。
基本概念
JavaScript 是单线程语言,通过事件循环机制处理异步操作,确保非阻塞的代码执行。
执行栈与任务队列
执行栈 (Call Stack):同步代码按顺序执行的地方
任务队列 (Task Queue):分为两种
- 宏任务 -
setTimeout
、setInterval
、I/O 操作 - 微任务 -
Promise
、async/await
、MutationObserver
执行顺序
console.log('1'); // 同步代码
setTimeout(() => {
console.log('2'); // 宏任务
}, 0);
Promise.resolve().then(() => {
console.log('3'); // 微任务
});
console.log('4'); // 同步代码
// 输出顺序:1 → 4 → 3 → 2
事件循环步骤
- 执行同步代码 - 直到执行栈为空
- 处理微任务 - 执行所有微任务直到队列清空
- 执行一个宏任务 - 从宏任务队列取出一个执行
- 重复步骤 2-3
实际应用
- 避免阻塞主线程 - 合理使用异步操作
- 优化用户体验 - 保持界面响应性
- 性能优化 - 理解代码执行优先级