导读:
- 什么是宏任务
- 什么是微任务
- 两者有什么区别
1. 什么是宏任务macroTask(也称为Task)?
宏任务:包含执行整体的js代码、事件回调(DOM事件),XHR回调(异步请求,接口回调),定时器(setTimeout/setInterval/setImmediate-->node环境),IO(input和output,文件的读出和写入等)操作,事件队列,UI render
2. 什么是微任务microTask?
微任务:更新应用程序状态的任务,包括Promise.[then/catch/finally]回调,async/await,MutationObserver(浏览器环境),process.nextTick(Node独有,注册函数的优先级比Promise回调函数要高),Object.observe,MutationObserver
3. 两者有什么区别?
3.1 宏任务执行是在DOM渲染之后,遵循的是浏览器W3C规范,JS引擎不处理,浏览器(或nodejs)干预处理;
微任务执行是在DOM渲染之前,遵循的是JS的ES6规范,JS引擎进行处理。即,跟浏览器没有关系,可以在执行完同步代码后,统一处理,这样更快更便捷。
所以在执行过程中,微任务的触发时机更早,即微任务 --> DOM渲染 --> 宏任务
补充:火狐(86.0.1)的有关DOM渲染和宏任务以及微任务的执行顺序是—— DOM --> 微任务 -->宏任务
3.2 宏任务执行队列在Callback Queue中,微任务执行队列在microTask Queue
延伸:JS的单线程指的是,只有一个线程用来执行JS函数,宏任务的监听和触发交给浏览器的线程执行,中间插入GUI渲染引擎进行DOM渲染
参考文章:
浅谈浏览器 eventloop 与 Nodejs eventloop 的不同点 ——文章中涉及到的宏任务与微任务的概念以及涉及到了浏览器和nodejs两者的eventloop之间的不同