事件循环执行逻辑为:先执行一个宏任务,再清空所有微任务,最后可能触发UI渲染;典型例子中输出顺序是1→4→3→2,因同步代码优先,微任务在宏任务后立即执行,setTimeout(0)需等下一轮循环。

直接画核心结构,不堆砌术语,重点突出执行逻辑和典型例子。
一、事件循环主干:三步闭环
每轮循环只做三件事,顺序固定:
- 执行一个宏任务(比如整个 script、setTimeout 回调、click 处理函数)
- 立即清空所有微任务(Promise.then、queueMicrotask 等,哪怕中途新增也继续执行)
- 浏览器可能触发 UI 渲染(仅在浏览器环境,Node.js 没这步)
二、任务分类:谁进哪个队列?
宏任务(低频、一次一个):
setTimeout / setInterval / setImmediate(Node)
I/O 回调(如 fetch.then 的底层回调)、UI 渲染、用户事件(click、input)、requestAnimationFrame、<script> 整体代码</script>
微任务(高频、必须清空):
Promise.then/catch/finally
MutationObserver
queueMicrotask
process.nextTick(Node 中优先级最高,比 Promise 还早)
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
三、关键执行规则
不是“谁先写谁先跑”,而是看进入队列的时机和优先级:
- 同步代码永远最先执行
- 所有微任务总在当前宏任务结束后、下一个宏任务开始前全部跑完
- setTimeout(0) 不等于立刻执行——它得等当前宏任务+所有微任务结束,再排队等下一轮循环
- 多个 setTimeout 比的是延迟时间:3ms 的比 0ms 的晚进队列,所以 0ms 先执行(即使代码里它写在后面)
四、一个经典示例速记
这段代码帮你锚定顺序:
console.log('1');setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
输出一定是:1 → 4 → 3 → 2
原因:同步(1、4)→ 微任务(3)→ 下一轮宏任务(2)

















