JavaScript定时器越走越快的问题

JavaScript定时器越走越快的问题

以前在项目中写了定时器来作循环播放,可是老是会有越走越快的问题,开始是觉得先后的HTML代码拼接的有问题,时间紧急的状况下反复改了不少也没什么效果,后来发现是js定时器的问题,在这里记录一下。html

(setinterval)屡次初始化

使用js定时器(setinterval)首要的问题就是要记得清除,即调用(clearInterval)方法,因为没有使用定时器的经验,我一开始是没有清除定时器,程序每一次初始化的时候都调用一次定时器,以前的定时器实例没有被销毁,新的定时器又开始执行,就会出现1s变0.5s,0.5s变0.25秒的状况,从观感上来看就是定时器“越走越快”了。java

这个过程能够用几行简单的代码模拟一下code

<label id="lblShowNum"></label>
<input type="button" id="btnStart" value="启动" />
<input type="button" id="btnClear" value="清除" />
window.onload = function () {
    var i = 0;
    var timer;
    document.getElementById("btnStart").onclick = function () {        
        timer = setInterval(
            function () {
                i++;
                document.getElementById("lblShowNum").innerText = i;
            }, 1000);
    }
    document.getElementById("btnClear").onclick = function () {
        clearInterval(timer);
    }
}

若是只点击一次“启动”按钮,定时器会正常运行,点击“清除”按钮就能够暂停定时器,可是每一次点击“启动”按钮,都会提升数字的增速,而清除功能也再也不起做用,这就是由于在每一次点击“启动”的时候都有新的定时器被建立。htm

清除(clearInterval)的失效

但为何清除的方法会失效呢?在代码中咱们定义了一个变量timer去接收定时器,对timer操做是否是就能清除定时器了呢?并非是这样,首先看下setinterval()返回值的说明对象

一个能够传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。ip

这里能够看出这个返回值并非定时器自己,它只是一个用于传递的返回值,若是想固然的把它当作定时器,觉得每次初始化赋值就是新的定时器就错了,我最开始就是这样想的。get

每一次给timer赋值都是在建立新的定时器对象,并且以前的定时器也并无被清除,因此这时候调用clearInterval(timer)清除的只是最后一个被建立的定时器对象罢了。input

使用上面的例子就能够简单的用肉眼观察效果,先点击一次启动观察速度,再点击第二次,会看到速度有明显的提高,这时候使用清除功能,速度就会回到第一次启动的状态,可是屡次点击清除是没有用的,若是想看准确的结果能够将时间打印出来进行比较。it

解决方法

看到这里,答案呼之欲出了,很简单,在每次初始化定时器以前先执行清除操做,保证以前的定时器被清除了就不会发生越走越快的状况,因此其实并非定时器越走越快,而是有多个定时器在执行,定时器里面的程序执行的频率提升了。

window.onload = function () {
    var i = 0;
    var timer;
    document.getElementById("btnStart").onclick = function () {       
        clearInterval(timer); 
        timer = setInterval(
            function () {
                i++;
                document.getElementById("lblShowNum").innerText = i;
            }, 1000);
    }
    document.getElementById("btnClear").onclick = function () {
        clearInterval(timer);
    }
}
相关文章
相关标签/搜索