lxw124 / Interview

前端
2 stars 0 forks source link

使用setTimeout模拟setInterval和直接用setInterval有什么区别 #6

Open lxw124 opened 4 years ago

lxw124 commented 4 years ago

首先使用setTimeout模拟setInterval可以这样写

setTimeout(function(){
      ...
     setTimeout(arguments.callee,interval)  
   },interval)

两者的不同就是setInterval可能会跳过某些某些间隔,可能多个定时器会连续执行,假如setInterval每隔100ms往队列中添加一个事件;100ms后,添加T1定时器代码至队列中,主线程中还有任务在执行,所以等待,some event执行结束后执行T1定时器代码;又过了100ms,T2定时器被添加到队列中,主线程还在执行T1代码,所以等待;又过了100ms,理论上又要往队列里推一个定时器代码,但由于此时T2还在队列中,所以T3不会被添加,结果就是此时被跳过;这里我们可以看到,T1定时器执行结束后马上执行了T2代码,所以并没有达到定时器的效果。 使用setTimeout模拟setInterval的话如果上一个事件没有执行完,下一个事件是不会进入队列,所以不会有连续执行的情况,保证定时器间隔