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

clearing timer value with clearInterval before initializing the timer

本文关键字:计时器 clearInterval 清除 使用 初始化      更新时间:2023-09-26

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

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

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

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

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

(强调我的)

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

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

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

  1. 将计时器设置为 0
  2. setInterval开始

如果您运行此功能两次(即一次初始启动,然后重置),则会设置两个间隔计时器,而不是一个。因此,秒表的运行速度将提高一倍。这是不希望的行为,因此函数应改为执行以下步骤:

  1. 停止当前间隔计时器,如果存在clearInterval
  2. 将计时器设置为 0
  3. setInterval开始

正如詹姆斯·索普(James Thorpe)指出的那样,传递给clearIntervalundefinednull参考并不是什么大问题。

如果你想在初始化之前安全地清除某些内容,但是您可以简单地初始化该内容:

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

或者你可以测试是否存在:

if(window.slip && slip.timer){
  clearInterval(slip.timer);
}

或者,如果您的代码处于闭包中并且未全局定义slip

if(typeof slip !== "undefined" && slip.timer){
  clearInterval(slip.timer);
}