请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 setTimeout 的执行时间

console.log('Hi');

setTimeout(function cb1(){
  console.log('cb1 5000')
}, 5000);

// 假设中间有好多行代码

setTimeout(function cb2(){
  console.log('cb2 4999')
}, 4999);

console.log('Bye');

本来以为 4999 肯定会比 5000 先执行

但是听完课之后,发现好像不是这样

cb1被放到 timer 之后直接就开始计时了,然后接着往后执行代码

直到 cb2 被放进 timer,可能这时候已经过了 1ms

所以输出的时候,有可能会 先输出 cb1 5000, 后输出 cb2 4999

我自己试验的时候,加了不少代码,但还是先输出了 4999,我感觉可能是加的代码不够多

然后试了一下把 4999 改成 4999.99999999999

发现确实先输出了 5000

所以我的理解应该没错吧? 想找老师印证一下

正在回答 回答被采纳积分+3

2回答

_麦当 2020-10-30 19:39:55

妙啊,前端真有意思

1 回复 有任何疑惑可以回复我~
双越 2020-10-14 21:41:26

计时,是所有代码运行完才开始计时的。所以 5000 永远比不过 4999

1 回复 有任何疑惑可以回复我~
  • 提问者 Arafat #1
    诶? 那为啥我把 4999改成 4999.999999999 之后先输出了 5000 ,然后输出的 4999啊...
    回复 有任何疑惑可以回复我~ 2020-10-14 21:43:08
  • 提问者 Arafat #2
    这里两个 setTimeout 不是同时执行的,先执行了 5000 的 setTimeout,然后执行了一堆同步代码,最后执行了 4999 的 setTimeout。 
    所以可能会有 5000 的先输出这个现象。 
    
    如果两个 setTimeout 是几乎同时进行的, 那肯定 5000 比不过 4999, 是这个意思吧?
    回复 有任何疑惑可以回复我~ 2020-10-14 21:46:47
  • 双越 回复 提问者 Arafat #3
    是的。
    而且,计算机编程的时间单位,最小单位就是 1ms ,你弄个 4999.999999 ,我也具体不知道编译器和 CPU 会怎么处理,反正日常没有人这么用。
    回复 有任何疑惑可以回复我~ 2020-10-15 08:43:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信