首页 > 试题广场 > 如下代码的打印结果是什么? console.log('on
[问答题]
如下代码的打印结果是什么?
console.log('one'); setTimeout(function() { console.log('two'); }, 0); Promise.resolve().then(function() { console.log('three'); }); console.log('four');

5个回答

添加回答
涉及事件循环队列的知识。主线程任务完成后,会完成所有微队列内的异步任务(promise),再去处理宏队列中的任务(setTimeout)
所以输出结果为 
one  
four 
three 
two
发表于 2018-12-10 15:53:09 回复(1)
console.log('one'); //1-1 setTimeout(function() { console.log('two'); }, 0);         //1-2 Promise.resolve().then(function() { console.log('three'); });//1-3 console.log('four');                                         //1-4
考查的知识点是事件循环和任务队列;
1:先执行script原代码  宏任务队列
    1-1:打印 ‘one’ 
    1-2:setTimeout()属于 宏任务队列的异步代码,WebAPIs会把setTimeout放到一个新的宏任务队列中 排队。
    1-3:Promise的then()属于微任务队列的异步代码, 执行栈会把then()中的代码放到 微任务队列中 排队。
    1-4:同步代码,打印 ' four';
    至此,script原代码  宏任务队列 执行完,接着执行 微任务队列 中的代码
    注:宏任务队列 和 微任务队列 是平行的两个队列,两者交替执行。
2:执行微任务队列中的代码
    2-1:微任务队列中,只有Promise的then代码,所以打印 ' three '
    微任务队列 执行完毕,再执行下一个 宏任务队列
3:执行下一个宏任务队列
    3-1:这时就到了setTimeout的宏任务队列了,因此就打印 ' two ' 啦。

关于事件循环和任务队列,以下文章讲解得比较详细,不太清楚的可以去了解了解:
发表于 2019-03-08 16:25:34 回复(0)
1) 主体部分: 直接输出one 再输出four(同步情况下,就是严格按照定义的先后顺序)

2)promise: 这里的promise.then部分,输出的是three

3) setTimeout : 最后输出two

综合的执行顺序就是: 


发表于 2019-01-22 10:54:29 回复(0)
one
four
three
two
发表于 2018-12-10 10:05:42 回复(0)
one
four
three
undefined
two
发表于 2018-12-07 15:19:05 回复(0)