setTimeout可以将字符串当成代码执行,类比eval函数。当遇到setTimeout或者SetInterval,他们会进入宏任务队列,此时,函数不执行,但是他们的时间会开始计算

请问以下JS代码的输出顺序是?

let date = new Date() setTimeout(() => { console.log('1') }, 2000) setTimeout('console.log(2)',1000); setTimeout(function() { console.log('3') }, 1500); while((new Date() - date) < 3000) {}

A
报错

B
3秒以后同时输出2 3 1

C
1秒后输出2,1.5秒后输出3,2秒后输出1

D
4秒后输出2,4.5秒后输出3,5秒后输出1

正确答案:B

需要明确一点的是setTimeout可以将字符串当成代码执行,类比eval函数。
While所在是微任务,所以前3秒后在执行while函数,
setTimeout函数虽然在各自对应时间后插入了队列,但是由于属于宏任务所以暂时还没有执行,直到while微任务完成,才按顺序输出。

在执行前八行代码的时候在回调函数队列里面依次添加三个回调函数,此时回调函数队列为【2,3,1】

然后在while循环里面停留三秒,这时已经把回调函数队列里面的三个回调函数的等待时间都花光了,等循环停留三秒结束后,立刻执行回调函数队列里面的函数,所以3秒以后同时输出2 3 1。

evenLoop,当遇到setTimeout或者SetInterval,他们会进入宏任务队列,此时,函数不执行,但是他们的时间会开始计算。如果程序微任务或者代码运行时间过长,那么执行宏任务时他们会直接执行


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17835643.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示