1.什么是微任务和宏任务?
ES6 规范中,microtask 称为 jobs,macrotask 称为 task
宏任务是由宿主发起的,而微任务由JavaScript自身发起。
总结一下,两者区别为:
| 宏任务(macrotask) | 微任务(microtask) | |
|---|---|---|
| 谁发起的 | 宿主(Node、浏览器) | JS引擎 |
| 具体事件 | script (可以理解为外层同步代码)、 setTimeout/setInterval、ajax、DOM事件、 requestAnimationFrame | Promise.then catch finally、async/await |
| 谁先运行 | 后运行 | 先运行 |
| 会触发新一轮的Call Stack吗 | 会 | 不会 |
2.微任务、宏任务和DOM渲染的关系
微任务是在DOM渲染前执行
宏任务是在DOM渲染后执行
3.微任务、宏任务和DOM渲染,在event loop中的过程
1.同步代码,一行一行放到Call Stack中执行
2.遇到异步(微任务和宏任务),会先记录下来,等待时机(定时、网络请求)
3.时机到了,就宏任务移到Callback Quene中
4.如果Call Stack为空(同步代码执行完毕),执行当前的微任务
5.微任务结束后,尝试渲染DOM
6.DOM渲染结束后,Event loop开始工作
7.轮询查找Callback Quene,如有则移动到Call Stack执行
8.然后继续轮询查找\