赞
踩
昨日俊熙没有更新题目,今日咱们继续来看相关题目.
一.第一题
我们来分析一下执行过程:
分析之前我们再来看一张图:
分析过程:
1.先打印出1
2.碰到了异步任务定时器,所以放到任务队列中,作为宏任务等候排队.
3.紧接着打印出3.
4.遇到了函数pro,但是并没有调用,所以并不执行,也加到任务队列中.
5.碰到了函数fn,下边也调用了,所以会执行,先输出6,然后函数pro此时得到了调用,所以此时Pro函数开始执行,打印出4,但是由碰到了异步任务resolve('成功'),所以加到任务队列中,但是5还是会在执行出来.
6.再紧接着输出7,到此为此,能执行的全执行出来了,下面该任务队列中的.
7.resolve作为微任务会优先于宏任务,所以接下来会执行成功的响应状态res,也就是输出'成功',最后再执行任务队列中的宏任务,所以输出2.
8.总结:输出顺序是:1 3 6 4 5 7 '成功' 2
验证一下答案:
结论:微任务会在宏任务之前执行.
二.面试题(此题稍微复杂)
我们来分析一下:
1.还是先输出1.
2.碰到了宏任务定时器,所以放到任务队列中等待执行.
3.new出来一个Promise对象,函数体里的代码会立即执行,所以输出5,但因为碰到了微任务rosolve,所以放到任务队列中,then因为是执行resolve的结果,所以一起到了任务队列中.(此时在你的脑海中应该有这样的画面:任务队列中有两排待执行任务,上边是微任务resolve,下面是宏任务settimeout,微任务会比宏任务先执行).
4.又碰到了一个宏任务定时器,再把它加入到任务队列中.
5.紧接着输出10,此时同步任务已经执行完,接下来都是该分析异步任务了.
6.紧接着该执行resolve了,它是微任务,优先性高,所以输出6.
7.剩下的就是两个宏任务定时器了,先执行第一个加到任务队列中的定时器,所以依次输出2 3 4;
紧接着输出另外一个定时器的结果,7 8 9 .(注意:如果两个定时器都有延时时间,比如说上面的定时器延时5000毫秒,下面的定时器只要比5000毫秒少,就会先执行延时时间短的定时器里的内容,这里需要注意一下).
8.总结结果:1 5 10 6 2 3 4 7 8 9
验证结果:
继续come on!!!
三.面试题
小伙伴们我们一起来分析一下:
过程:1.首先先执行3,因为他是一个同步任务,输出3.new Promise虽说会立即执行,但由于他包含了一个异步任务, 所以先去任务队列中.任务队列中也有先后顺序,即使第一个Promise对象先过去,但是他里边嵌套着一个新的Promise对象,所以这个新嵌套的Promise对象会排在任务队列的最前面,都是作为微任务而存在.
2.接下来执行任务队列中的异步任务,所以毋庸置疑接下来该输出2,因为在任务队列中他排第一名,紧接着输出1.
3.总结答案: 3 2 1
验证一下答案:
再来最后一道,小伙伴们!!!
四.面试题
这道题有坑,注意!!!
注意事项:这道体有的小伙伴一上来就要输出6,其实不对, 上面那道题之所以把Promise对象放进了任务队列中,本身是由于他要执行异步任务,咱们这道题虽说也包含着异步任务,但毕竟去任务队列之前,有一个console.log(2),所以会先输出2,又因为他里边再次嵌套一个Promise对象,有一个console.log(3),所以会紧接着输出3.
分析过程:1.上边已经解释过了,第一步先输出2,第二步输出3,然后遇见了异步任务,所以进入到了任务队列中.
2.紧接着再输出6.
3.开始执行任务队列中的微任务,输出'p2',为什么是他呢?小伙伴们是否还记得我刚才在上道题的分析,他也作为一个微任务加入到了任务队列中,他是第二次加入,会自动排到第一个Promise对象前,所以先执行,再执行'p1'.
4.微任务都执行完毕后,开始执行宏任务定时器,按照顺序依次执行就好,先输出1 4 5
5.总结答案:2 3 6 'p2' 'p1' 1 4 5
验证一下答案:
你学会了吗?觉得还不错的话可以关注一下奥!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。