JS事件循环基于调用栈、微任务队列(Promise)、宏任务队列(setTimeout)的协作。setTimeout(fn, 0)并非“立即”,而是将回调推入宏任务队列,等待当前调用栈和所有微任务清空后才执行。这是很多异步bug的根源。在开发中,我常用这个机制优化渲染性能——将非关键的UI更新放入setTimeout,确保主线程优先处理用户交互。但更推荐用Promise.resolve().then()做微任务调度,响应更快。⚡ 经验法则:微任务优先于宏任务,理解顺序才能写出可靠的异步代码。