有 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'));
});
不知大家有啥想法
1
IsaacYoung 2019-07-13 15:42:17 +08:00
1 a b c d e 2 3 有问题吗?
|
2
cheroky OP @IsaacYoung 确实是这个结果,但是按面试官那个那个情景执行顺序就不对
|
3
reus 2019-07-13 16:12:50 +08:00
讨论这种未定义行为是无意义的
谁写代码依赖这个,谁就是挖坑 |
4
rabbbit 2019-07-13 16:13:18 +08:00
没看出哪里有错, 微任务优先,全部完成后执行宏任务.
面试官的情景是指什么? |
5
sunjourney 2019-07-13 16:24:23 +08:00
@reus #3 这是有定义的行为
|
6
meszyouh 2019-07-13 16:39:39 +08:00 via Android
这个不是看环境么。
|
7
reus 2019-07-13 16:45:33 +08:00
@sunjourney 是在哪个标准里定义的?
|
8
reus 2019-07-13 16:58:42 +08:00 1
@sunjourney 这个行为没有哪个标准有定义,只不过各个 js 引擎都实现成这样,node 直到去年,都没有这个保证,后来才改成和浏览器一致: https://github.com/nodejs/node/issues/22257。所以这就是个未定义行为。如果执行环境是比较旧的 node,行为就不一致了。
|
9
reus 2019-07-13 16:59:01 +08:00
|
10
Sparetire 2019-07-14 02:33:16 +08:00 via Android
看是 node 还是浏览器
|
11
yimity 2019-07-15 10:16:13 +08:00
谁代码要这么写,我肯定打死他。
|
12
lvcq 2019-07-23 10:14:09 +08:00
标准里有定义没
|
13
xcstream 2020-03-18 01:59:26 +08:00
直接反问 你能保证所有的浏览器和 node 都能跑出一样的结果吗
|