setTimeout和setInterval的执行会延时吗
setInterval的回调函数不是定时执行
我们都知道js是单线程机制,异步也是伪异步
所谓异步调用的原理其实是将代码插入到代码执行队列中实现(代码的延迟执行)
代码插入点前的代码执行时间超过了传入setTimeout或setInterval的设定时间会怎样呢?
这样肯定会导致第一次的setTimeout或setInterval不能按时执行
而下一次触发时间则是在setInterval回调函数执行完毕之后
假设setInterval内的计算十分耗时,将会导致计数更加不准
如何解决定时器不准确
可以通过计算时差来解决这个问题
var startTime = new Date().getTime();//获取开始时间 var count = 0; setInterval(function(){ var i = 0; while(i++ < 100000000); }, 0); function fixed() { count++; var offset = new Date().getTime() - (startTime + count * 1000);//当前时间与准确时间差距 var nextTime = 1000 - offset;//下次触发的时间 if (nextTime < 0) nextTime = 0; setTimeout(fixed, nextTime); console.log(new Date().getTime() - (startTime + count * 1000));//查看时间 } setTimeout(fixed, 1000);