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