JavaScript 事件轮询机制
JavaScript 事件轮询机制
JavaScript 的事件轮询(Event Loop)是其实现异步编程的核心机制。以下是其工作原理的详细解释:
基本概念
- 单线程特性:JavaScript 是单线程语言,同一时间只能执行一个任务。
- 非阻塞 I/O:通过事件轮询机制实现异步操作,避免阻塞主线程。
事件轮询组成
事件轮询由以下几个主要部分组成:
- 调用栈(Call Stack):存储函数调用的栈结构,后进先出。
- 任务队列(Task Queue):包括宏任务队列和微任务队列。
- 事件轮询(Event Loop):持续检查调用栈和任务队列的机制。
执行流程
- 同步代码执行:所有同步代码直接进入调用栈执行。
- 异步处理:
- 遇到异步操作(setTimeout、Promise等)时,交给浏览器API处理
- 完成后将回调函数放入相应的任务队列
- 事件轮询工作:
- 当调用栈为空时,事件轮询开始工作
- 优先检查微任务队列并执行所有微任务
- 然后从宏任务队列中取出一个任务执行
- 重复此过程
任务类型
宏任务(Macro Tasks)
- setTimeout / setInterval
- I/O 操作
- UI 渲染
- setImmediate(Node.js)
微任务(Micro Tasks)
- Promise.then / catch / finally
- MutationObserver(浏览器)
- process.nextTick(Node.js,优先级高于其他微任务)
示例分析
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// 输出顺序:1, 4, 3, 2
Node.js 与浏览器差异
Node.js 的事件轮询更为复杂,分为多个阶段:
- timers(定时器)
- pending callbacks(系统操作回调)
- idle, prepare(内部使用)
- poll(轮询I/O事件)
- check(setImmediate回调)
- close callbacks(关闭事件回调)
理解事件轮询机制对于编写高效、无阻塞的JavaScript代码至关重要,特别是在处理异步操作时。
浙公网安备 33010602011771号