第一、定时器的设置:
1、setTimeout(fn,interval);过多长时间执行一次,只执行一次,但是可以设置循环调用,例如:
showTime();
function showTime() {
//处理
setTimeout(showTime(),interval);
}
2、setInterval(fn,interval)过多长时间执行,会在间隔的时间到了后重复执行某个函数,但是有缺点:由于代码执行队列的问题,定时器插入时间并不代表是实际执行时间,就可能会导致1)某些间隔会被跳过;2)多个定时器的代码执行之间的间隔可能会比预期的小。
setInterval(showTime(),interval)
function showTime() {
//处理
}
3、两者最大的区别就是setTimeout会等到前一个showTime执行完毕之后再重复新一次的,而setInterval则会在精准的时间后重复执行。
4、引用:
这两种方法可能看起来非常像,而且显示的结果也会很相似,不过两者的最大区别就是,setTimeout方法不会每隔5秒钟就执行一次showTime函数,它是在每次调用setTimeout后过5秒钟再去执行showTime函数。这意味着如果showTime函数的主体部分需要2秒钟执行完,那么整个函数则要每7秒钟才执行一次。而setInterval却没有被自己所调用的函数所束缚,它只是简单地每隔一定时间就重复执行一次那个函数。
如果要求在每隔一个固定的时间间隔后就精确地执行某动作,那么最好使用setInterval,而如果不想由于连续调用产生互相干扰的问题,尤其是每次函数的调用需要繁重的计算以及很长的处理时间,那么最好使用setTimeout。
5、为避免setInterval的缺点,可以如下调用:
setTimeout(function(){ //处理中
setTimeout(arguments.callee,interval) },interval);
这个模式链式调用了setTimeout(),每次函数执行的时候都会创建一个新的定时器。第二个setTimeout()调用使用了arguments.callee来获取对当前执行函数的引用,并为其设置另外一个定时器,这样的好处是,在前一个定时器代码执行完毕之前,不会向队列插入新的定时器代码,保证不会有任何缺失的间隔,而且可以保证在下一次定时器代码执行前,至少要等待指定的间隔,避免了连续的运行。第二、清除定时器:
clearTimeout(showTime);