可以用一个超现实的例子来形容:宏任务是一个核桃壳,那微任务就是这个核桃壳里的仁.为什么说这是超现实的例子呢?因为你吃完这些核桃仁可能会发现里面竟然还有一个或多个核桃,甚至循环往复.
常见的宏任务: 整个代码块(script), setTimeout, setInterval
为什么说这些是宏任务?因为它就像核桃壳一样,里面是必定有核桃仁(或者下一个核桃)的.
而微任务(也就是吃核桃仁)在什么时候执行呢?就是擦嘴巴(渲染)前执行.每个宏任务执行完后准备执行下一个宏任务前必定要渲染, 这个条理性是必然的, 就好像吃完东西必须擦嘴巴一样.
相信看了上面的例子, 理解这张图已经是易如反掌.
如何区分宏任务与微任务?
宏任务是由宿主(Node,浏览器)发起的, 常见具体事件有:
1. script (可以理解为外层同步代码)
2. setTimeout/setInterval
3. UI rendering/UI事件
4. postMessage,MessageChannel
5. setImmediate,I/O(Node.js)
微任务是由js引擎发起的, 常见具体事件有:
1. Promise
2. MutaionObserver
3. Object.observe(已废弃;Proxy
对象替代)
4. process.nextTick(Node.js)
本文参考https://segmentfault.com/a/1190000020889508
感谢博主!