同步任务和异步任务
js将任务分为了同步任务和异步任务,同步任务是指在主线程上排队执行的任务,异任务指的是,不进入主线程、而进入“任务队列”的任务,只有在主线程上的任务都执行完之后才会执行“任务队列”里面的任务。
异步任务
异步任务分为宏任务和微任务
常见宏任务、微任务
- 宏任务:script、setTimeout、setInterval、postMessage、MessageChannel、setImmediate(Node.js 环境)
- 微任务:Promise.then、Object.observe(已废弃)、MutationObserver、process.nextTick(Node.js 环境)
什么是宏任务?什么是微任务?
- 微任务:一个需要异步执行的函数,执行时机是在主函数执行结束之后、当前宏任务结束之前。
- 宏任务:宏任务的时间粒度比较大,执行的时间间隔是不能精确控制的,对一些高实时性的需求就不太符合。
事件循环:宏任务和微任务的执行顺序
事件循环: 执行js代码的时候,遇见同步任务,直接推入调用栈中执行,遇到异步任务,将任务挂起,等到异步任务有返回之后推入到任务队列中,当调用栈中所以同步任务全部执行完成,将任务队列中的任务按顺序一个一个推入并执行,重复执行这一系列的行为。
- 先执行宏任务script,并执行里面的同步任务;
- 执行栈为空后查询是否存在微任务,存在就立即执行,然后开始下一轮的事件循环。
总结:
宏任务和微任务是对同步任务和异步任务的更细致划分js执行时,会先执行宏任务,再执行宏任务下所有的微任务,之后再启下一次的宏任务执行。先执行宏任务script。
注:如果不关注script,优先执行微任务