微任务与宏任务:
因为浏览器的任务队列不止一个,还有 microtasks 和macrotasks
microtasks(微任务): process.nextTick、 promise、 Object.observe、MutationObserver
macrotasks(宏任务):setTimeout、setInterval、
setImmediate、I/O、UI渲染
据whatwg规范介绍:
一个事件循环(event loop)会有一个或多个任务队列(task queue)
每一个 event loop 都有一个 microtask queue
task queue == macrotask queue != microtask queue
一个任务 task 可以放入 macrotask queue 也可以放入 microtask queue 中
调用栈清空(只剩全局),然后执行所有的microtask(微任务)。当所有可执行的microtask(微任务)执行完毕之后。循环再次从macrotask(宏任务)开始,找到其中一个任务队列执行完毕,然后再执行所有的microtask,这样一直循环下去。
例子:
console.log(1);
var t = setTimeout(function() {
console.log(2);
}, 0)
console.log(t);
var promise = new Promise(function(resolve, reject) {
console.log(3);
resolve();
})
promise.then(function() {
console.log(4);
})
console.log(5);