# 宏任务
由宿主发起的
可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。 浏览器为了能够使得JS内部宏任务与DOM任务能够有序的执行,会在一个宏任务执行结束后,在下一个宏任务 执行开始前,对页面进行重新渲染。
| 宏任务 |
|---|
| js脚本执行(可以理解为外层同步代码) |
| UI rendering/ UI事件 |
| postMessage,MessageChannel |
| I/O |
| setTimeout/ setInterval |
| setImmediate(浏览器暂时不支持,只有IE10支持,具体可见MDN) |
# 微任务
由JavaScript自身发起
微任务,可以理解是在当前 task 执行结束后立即执行的任务。 也就是说,在当前task任务后,下一个task之前,在渲染之前。 所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染。 也就是说,在某一个宏任务执行完后,就会将在它执行期间产生的所有微任务都执行完毕(在渲染前)。
| 微任务 |
|---|
| MutationObserver |
| Promise.then(或.reject) |
| Object.observe(已废弃;Proxy 对象替代) |
| Process.nextTick(Node独有) |
← async await eventLoop →