宏任务 和微任务 的一到关于先后执行的面试题

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");
 
 
 //  求解,执行顺序的原理???
阅读 3.3k
2 个回答

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

新手上路,请多包涵

好奇为什么第一个setTimeout(time1)执行完后会先执行第二个setTimeout(time2)而不是第一个setTimeout(time1)内的setTimeout(time3)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题