http://ejohn.org/blog/how-javascript-timers-work

这是John的一篇博文说到setTimeout和setInterval的区别,在看js高效图形编程的时候文中提到的。

 

首先很明显的是:

1. setTimeout是定时触发,在一定的延时后只触发一次,但是可以利用回调一个setTimeout来实现循环触发,比如:

setTimeout(function(){
    /* Some long block of code... */
    setTimeout(arguments.callee, 10);
  }, 10);

而setInterval本身即表示循环触发,直到被取消为止(clearInterval(id);)。

 

2.JS是单线程的,每一个异步操作被触发时,如果当前正好有其他事件或者函数正在被执行,比如(用户突然点击了鼠标触发了某个onclick事件,我们是不能预测的),那个异步操作就会被压入queue队列中等到当前事件被执行之后再调用。

 

3.setTimeout被初始化之后被触发时一定会被压到队列中,等待被执行,而setInterval如果被触发时,发现先前有一个interval块再队列中没有被执行,那么他就会丢弃当前这个被触发的interval块,而不将其压入队列中。

 

这张图片诠释的非常好!可以看到红字的dropped是因为之前的一个interval还没有被执行,所以这个interval就不会被压到队列中。 

所以setTimeout被调用的函数是可以预测一定会被执行的,setInterval则不一定,可能会在过程中被丢弃某一次的执行。但是具体是经过多少时间才被执行的,两者都是不能预测的,因为会被其他不可预测的事件阻塞