我正在浏览html5boilerplate github并且我去看了一些面试问题,我遇到了这个问题,我不明白为什么它按照它的顺序输出.我认为它将是一个四二三而不是它的输出.有人可以解释原因吗?对不起,如果太简单了.
问题:以下代码打印什么?
console.log('one');
setTimeout(function() {
console.log('two');
}, 0);
Promise.resolve().then(function() {
console.log('three');
})
console.log('four');
Run Code Online (Sandbox Code Playgroud)
输出按此顺序"一""四""三",最后"两"
Nul*_*ter 12
我想输出one和four是相当清楚的。setTimeout是主任务队列的一部分,Promise而是微任务队列的一部分,这就是为什么打印“三个”,最后打印“两个”的原因。
逐步执行如下:
执行脚本时,首先执行console.log(“ one”)。
当setTimeout(…)遇到,运行时间发起一个计时器,和0毫秒后。回调function() {}的setTimeout(…)在任务队列中排队。
当遇到promise对象时,其回调即function() {}在微型任务队列中排队。
最后,它执行last console.log(“four”)。
根据标准规格
一旦调用堆栈被清空,它将检查Micro任务队列并找到function() {}promise的回调。调用堆栈将执行它(记录三)。
再一次,在处理Micro任务队列中的回调后,将清空呼叫堆栈。最后,事件循环拿起从任务队列即回调新任务function() {}的setTimeout(…) (原木二)执行它。
视觉影像