关于 setTimeout 的执行时间

来源:8-5 event loop 的执行过程

Arafat

2020-10-14

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

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

写回答

2回答

_麦当

2020-10-30

妙啊,前端真有意思

1
0

双越

2020-10-14

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

1
4
Arafat
回复
双越
好的~感谢老师 ~~ 嗯我只是好奇~ 我试了一下 4999.9999 就是后面的 9 少一点的时候,还是 4999 先输出 但是变成 4999.9999999999 后面的 9 多一点的时候,就是 5000 先输出了 说明中间那段代码,不到 1ms 其实就已经执行完了 不过虽然差别很小,但也应该是说明了同步代码执行完之前,web API 的计时器就已经开始计时了~
2020-10-15
共4条回复

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程