宏任务和微任务区别
宏任务
常见的宏任务:
- 渲染事件(如解析 DOM、样式、布局、绘制)
- DOM事件(例如点击事件、键盘事件、鼠标事件等)
- JS定时器
- 网络请求完成等。
微任务
在浏览器里,微任务产生的方式有两种:
- Promise中调用resolve() 和 reject() 会产生微任务,并将对应的任务按照顺序添加到当前宏任务的微任务队列上
- 使用 MutationObserver API 观察 DOM 变化时,其回调也会被添加到微任务队列中。
区别
宏任务和微任务本质上就是异步回调,但是各自执行时机不同。
- 宏任务:是添加到消息队列,当事件循环到这个任务的时候就会执行回调
- 微任务是添加到微任务队列,是在主函数执行结束之后,当前宏任务结束之前执行回调
- 微任务比宏任务的执行时间要早
- 宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。