事件循环
事件循环指在javascript引擎中等待任务,执行任务,进入休眠等待更多任务几种状态间转换的无限循环
js事件循环核心机制:同步代码 → 微任务队列 → 宏任务队列 的执行优先级
(function () { console.log(1) setTimeout(() => { console.log(2); }); queueMicrotask(() => console.log(3)) new Promise(resolve => { console.log(4); setTimeout(() => { resolve(); console.log(5); }, 0); Promise.resolve().then(() => console.log(6)); console.log(7); }).then(() => { console.log(8); Promise.resolve().then(() => console.log(9)); }); console.log(10); })();
宏任务
宏任务表示执行时间较长的任务,在每次时间循环时只会执行一个宏任务,执行完毕后处理微任务队列,所有微任务都执行完毕后进入下一个宏任务。
- 定时器任务
- dom事件回调
- I/O操作
- 浏览器用于执行动画的方法 requestAnimationFrame ,执行时机与渲染相关
- Node.js 环境的 setImmediate
- script 标签内主线程的同步代码(整体作为一个宏任务)
微任务
微任务表示更轻量的异步任务,当宏任务执行完毕之后立即执行。
- Promise.then() / Promise.catch() / Promise.finally()
- 浏览器监听 DOM 变化的 API 对象,比如:MutationObserver
- 手动添加微任务API方法:queueMicrotask()
- nodejs 中的 process.nextTick()
总结
js脚本优先执行同步代码,宏任务和微任务分别加入宏任务队列和微任务队列
同步代码执行完毕,执行一个宏任务,然后清空微任务队列,
执行下一个宏任务,重复该循环