先看题目: 请输出以下代码的打印顺序
function a() {
console.log(1)
Promise.resolve().then(function () {
console.log(2)
})
}
setTimeout(function () {
console.log(3)
}, 0)
Promise.resolve(3).then(a)
如何快速且正确得得出这类题目的答案,我来分享一个方法:
首先:你要清楚3个分类,分别是:
主线程
微队列(promise)
延迟队列 (setTimeout)
他们的执行优先级是:主线程 > 微队列 > 延迟队列
了解了这个后,就可以对代码进行分析了,为了方便说明,fn指console.log(n),我们通过执行优先级进行排队:
- 作为主线程的f(5)排在第1位
- 作为微队列promise排在第2位
- 作为setTimeout的延迟队列f(3)排在第3位
按照队列一个个执行(js是单线程的),首先是主线程的f5,打印5,接下来是微队列promise,即f(a),打印出1和2,最后执行延迟队列setTimeout,打印出3
最后的打印结果是:
5123
同类题目都可以使用这个方法进行分析,屡试不爽