前两天遇到一个面试题,来跟大家一起讨论一下

2019 年 7 月 13 日
 cheroky

有 3 个宏任务,5 个微任务,第一个宏任务刚刚执行完毕。 问:剩下的任务的执行顺序。

当时我想都不想答 5 个微任务先执行,然后执行剩下 2 个宏任务,面试官答不对,还需要了解下宏任务微任务执行机制。网上好像都搜不到类似的题。拿下列代码试,结果也不对。

setTimeout(_=>{
	console.log(1);
    setTimeout(_=>console.log(2));
    setTimeout(_=>console.log(3));
    Promise.resolve().then(_ => console.log('a'))
    .then(_ => console.log('b'))
    .then(_ => console.log('c'))
    .then(_ => console.log('d'))
    .then(_ => console.log('e'));

});

不知大家有啥想法

4654 次点击
所在节点    JavaScript
13 条回复
IsaacYoung
2019 年 7 月 13 日
1 a b c d e 2 3 有问题吗?
cheroky
2019 年 7 月 13 日
@IsaacYoung 确实是这个结果,但是按面试官那个那个情景执行顺序就不对
reus
2019 年 7 月 13 日
讨论这种未定义行为是无意义的
谁写代码依赖这个,谁就是挖坑
rabbbit
2019 年 7 月 13 日
没看出哪里有错, 微任务优先,全部完成后执行宏任务.
面试官的情景是指什么?
sunjourney
2019 年 7 月 13 日
@reus #3 这是有定义的行为
meszyouh
2019 年 7 月 13 日
这个不是看环境么。
reus
2019 年 7 月 13 日
@sunjourney 是在哪个标准里定义的?
reus
2019 年 7 月 13 日
@sunjourney 这个行为没有哪个标准有定义,只不过各个 js 引擎都实现成这样,node 直到去年,都没有这个保证,后来才改成和浏览器一致: https://github.com/nodejs/node/issues/22257。所以这就是个未定义行为。如果执行环境是比较旧的 node,行为就不一致了。
reus
2019 年 7 月 13 日
Sparetire
2019 年 7 月 14 日
看是 node 还是浏览器
yimity
2019 年 7 月 15 日
谁代码要这么写,我肯定打死他。
lvcq
2019 年 7 月 23 日
标准里有定义没
xcstream
2020 年 3 月 18 日
直接反问 你能保证所有的浏览器和 node 都能跑出一样的结果吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/582658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX