setTimeout(() => {
console.log("time1");
setTimeout(() => {
console.log("time3");
}, 0);
new Promise((resolve) => {
resolve();
console.log("new resolve");
}).then(() => {
console.log("Promise then");
});
}, 0);
setTimeout(() => {
console.log("time2");
}, 0);
console.log("mian");
// 求解,执行顺序的原理???
这个问题是老生常谈了,前人之述备矣,本来想推一下官方的手册,奈何今天是用手机作答,麻烦得很。
首先就是简记一个规则:宏任务跟微任务都要执行的时候,微任务优先,然后这里
Promise.then
是微任务,setTimeout
(的回调函数)在宏任务里,你说这俩碰到一块谁先?然后本着记少不记多的原则,记住哪些东西是微任务,通常只会考察
Promise
,毕竟微任务的实现貌似就是为了迁就这货的,面子这么大,记不住都不好意思说自己会现代JS。在这个题中还有一个隐藏的知识点:向Promise的构造函数传递的函数的第一个参数就是
Promise.then
,了解这一点就不会疑惑为啥先有promise then
后有promise resolve
。然后你猜第二个参数是啥?关于
Promise
我还有一种更加阴损的问法,但是我不说,懂我意思的人也不会说,不然让面试的出题家们学了去就太损了。当然面试的时候最好能主动扩展一下,说说这段代码在遇到基于
polyfill
版本的Promise
时会有怎样的风景,注意观察一下面试官的微表情,如果他没有微笑的话说明他技术比较菜,可能比你还菜。