为了账号安全,请及时绑定邮箱和手机立即绑定

关于setTimeout的延时参数

关于setTimeout的延时参数

慕少森 2018-10-05 11:24:10
各位大佬,小弟请问个问题:以下代码为什么输出结果是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);//第二执行


查看完整回答
反对 回复 2018-10-22
?
Qyouu

TA贡献1786条经验 获得超11个赞

题主似乎对js的任务队列有误解,就是因为js是单线程的,才有的这个任务队列机制,但任务队列并不是单线程的,可以多任务同步执行 [由浏览器实现]
所以你的2个setTimeout基本是同时委托浏览器异步执行计时操作,浏览器根据你设定的时间调用回调函数,肯定是设置为0的那个先触发了

查看完整回答
反对 回复 2018-10-22
  • 2 回答
  • 0 关注
  • 755 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号