在初始化定时器之前使用clearInterval清除定时器值

时间:2015-03-09 19:52:11

标签: javascript timer

谷歌搜索某些内容时,我发现了这段代码。

clearInterval(slip.timer);    
slip.timer = setInterval(function () { mv(target, direction); }, 15);

我怀疑首先我们需要使用setInterval设置计时器,然后使用clearInterval清除它。这就是我们如何在初始化之前使用slip.timer? 谁能帮我? 我们在哪些应用程序中编码?

2 个答案:

答案 0 :(得分:4)

只要在代码运行时初始化slip,就可以了。如果clearInterval未设置,则调用undefined的值不是有效的时间间隔ID(例如nullslip.timer)是根据the spec定义的行为:

  

clearTimeout()和clearInterval()方法必须清除该条目   从活动计时器列表中识别为句柄   调用方法的WindowTimers对象,如果有的话,在哪里   handle是传递给方法的参数。 (如果句柄没有   识别WindowTimers的活动计时器列表中的条目   调用该方法的对象,该方法不执行任何操作。

(强调我的)

这是一种相当常见的方法,可以多次触发计时器,以确保您没有多个间隔计时器副本调用您的回调 - 如果有可能会发生,您要确保清除在开始新的间隔之前的前一个间隔。

答案 1 :(得分:0)

如果多次使用这些计时器,则在开始新的setTimeoutsetInterval之前清除它是有用的。

考虑这个例子:你有一个从0开始的秒表。你启动它并且数字增加。现在您想要重置秒表并使其仍然运行(例如,注意完成一圈的时间)。您可以使用单个函数执行以下操作来完成此操作:

  1. 将计时器设为0
  2. setInterval
  3. 开头

    如果您运行此功能两次 - 我即一个初始启动然后重置 - 将设置 两个 间隔计时器,而不是一个。因此,秒表将 运行两倍 。这是不希望的行为,因此该功能应该执行以下步骤:

    1. 如果有一个
    2. ,请使用clearInterval停止当前间隔计时器
    3. 将计时器设为0
    4. setInterval
    5. 开头

      正如James Thorpe指出的那样,传递给undefined的{​​{1}}或null引用不是什么大问题。

      如果你想在清除某些内容之前保持安全,那么你可以简单地初衷一下:

      clearInterval

      或者您可以测试是否存在某些内容:

      var slip = {
          timer: 0
        };
      
      // … Later:
      clearInterval(slip.timer);
      

      或者,如果您的代码位于闭包中,并且if(window.slip && slip.timer){ clearInterval(slip.timer); } 未在全局定义:

      slip