各位大佬,小弟请问个问题:以下代码为什么输出结果是1,4,3,2,而不是1,4,2,3;js主线程从上至下执行时,碰到异步代码,会将其插入到任务队列,任务队列里应该是1000的在0的前面,还是说setTimeout第二个参数就是延时多长时间将其插入到任务队列?console.log(1);setTimeout(function () { console.log(2);}, 1000);setTimeout(function () { console.log(3);}, 0);console.log(4);结果:
2 回答

互换的青春
TA贡献1797条经验 获得超6个赞
console.log(1);//最先执行
setTimeout(function () {
console.log(2);//这个没什么好说的,1秒后执行,最后一个
}, 1000);
setTimeout(function () {
console.log(3);//定时器有延时,虽然设置了0,代表0秒后就执行,但是实际是有一定延时的,接近0而已,相当于异步,所以要等同步执行的执行完才轮到它,所以第三
}, 0);
console.log(4);//第二执行

Qyouu
TA贡献1786条经验 获得超11个赞
题主似乎对js的任务队列有误解,就是因为js是单线程的,才有的这个任务队列机制,但任务队列并不是单线程的,可以多任务同步执行 [由浏览器实现]。
所以你的2个setTimeout
基本是同时委托浏览器异步执行计时操作,浏览器根据你设定的时间调用回调函数,肯定是设置为0的那个先触发了
添加回答
举报
0/150
提交
取消