宏任务和微任务
什么是宏任务、微任务
宏任务可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)。
微任务可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。
宏任务有哪些、微任务有哪些
宏任务包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。
微任务包括: Promises, Object.observe, MutationObserver
宏任务微任务的执行顺序
执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。
实例
setTimeout(function(){
console.log('1');
});
new Promise(function(resolve){
console.log('2');
resolve();
}).then(function(){
console.log('3');
});
console.log('4');
遇到setTimout,异步宏任务,放入宏任务队列中; 遇到new Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2; 而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中 遇到同步任务console.log(‘4’);输出4;主线程中同步任务执行完 从微任务队列中取出任务到主线程中,输出3,微任务队列为空 从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空,结束~