众所周知,js是单线程的,就像咱们不能一边刷牙一边洗脸(或许有些大佬真的能够),那么单线程如何才能规划调度好要作的任务呢?
这个时候就要介绍一下这个任务机制了~node
注意:浏览器环境和node环境是不同的,本文只讨论浏览器环境promise
执行一个宏任务(先执行同步代码)-->执行全部微任务-->UI render-->执行下一个宏任务-->执行全部微任务-->UI render-->浏览器
根据HTML Standard,一轮事件循环执行结束以后,下轮事件循环执行以前开始进行UI render。即:macro-task任务执行完毕,接着执行完全部的micro-task任务后,此时本轮循环结束,开始执行UI render。UI render完毕以后接着下一轮循环。可是UI render不必定会执行,由于须要考虑ui渲染消耗的性能已经有没有ui变更
须要注意的是,微任务是有优先级的,就如同上面的表格从上往下同样,nextTick>Promise>MutationObserver.性能
大部分浏览器会把DOM事件回调优先处理 由于要提高用户体验 给用户反馈,其次是network IO操做的回调,再而后是UIrender,以后的顺序就难以捉摸了,其实不一样浏览器的表现也不太同样,这里不作过多讨论。ui
console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0); Promise.resolve().then(function() { console.log('promise1'); }).then(function() { console.log('promise2'); }); console.log('script end');
答案是
'script start'、'script end'、'promise1'、'promise2'、'setTimeout'
先走完全部同步代码-到promise微任务-宏任务setTimeoutspa