【问题标题】:Should I call clearTimeout before overwriting the timeout variable?我应该在覆盖超时变量之前调用 clearTimeout 吗?
【发布时间】:2012-04-11 16:02:27
【问题描述】:

刚刚在我们的应用程序中找到了这个代码-sn-p。我想知道第一行是否是多余的——如果变量立即被覆盖,是否需要对变量调用 clearTimeout?或者有什么我应该注意的情况?

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(function () { countdownHandler() }, MILLISECONDS);
}

我的预感是“是的,你需要调用 clearTimeout”,因为我想不出如果可以将 timeout 变量设置为 null,为什么 clearTimeout 方法会存在。

我想更好的问题是:

var timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);
timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);

我现在有两个函数等待大约 MILLISECONDS 触发,还是只有一个?

【问题讨论】:

  • setTimeout(function () { countdownHandler() }, ...) 是多余的,除非这只是为了说明。应该是setTimeout(countdownHandler, ...)
  • 是的,你是对的。在完全清理代码之前解决基本问题。 :) 不过谢谢。
  • 第一次setTimeout之前sessionTimeoutHandle是如何初始化的?

标签: javascript settimeout


【解决方案1】:

您对 setTimeout 的调用会返回一个整数来标识它,以便在您想要清除它时引用它。因此,覆盖变量并不会清除超时,它只会覆盖您对它的 id 的引用。如果覆盖引用,则无法再清除较早的引用:-(

您将使用 Niko 所说的 clearTimeout - 来阻止回调触发。

插图:

var t = setTimeout(ch, 1000, "first timeout");
t = setTimeout(ch, 1500, "second timeout");
clearTimeout(t); // this will only clear the second timeout
t = setTimeout(ch, 2000, "third timeout");
function ch(s){
  console.log(s);
}

我希望这是一些帮助。

【讨论】:

  • 这应该被选作答案。
【解决方案2】:

不,只有当你确实需要清除它时才需要调用它。

如果这是唯一使用该变量的代码,那么应该没有必要。


仅供参考,看来您可以稍微缩短代码...

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(countdownHandler, MILLISECONDS);
}

匿名函数没有任何收获。

【讨论】:

  • 因此,如果我调用 setTimeout 并定义了 sessionTimeoutHandle -- 即使 sessionTimeoutHandle 已被新值覆盖,它作为计时器的函数是否仍会被触发?
  • @SeanAnderson 是的,它仍然会被触发 - 覆盖句柄不会阻止原始计时器触发 - 这就是 clearTimeout 的用途。
  • @SeanAnderson:setTimeout 返回的值只是一个Number 原语。它没有超出任何其他数字的行为。
  • 好的。这就是我想确认的。谢谢。
【解决方案3】:

我想不出为什么会存在 clearTimeout 方法

clearTimeout 的存在是为了取消一个现有的计时器,即清除计时器并阻止其回调函数被调用。

【讨论】:

    【解决方案4】:

    clearTimeout 用于取消超时,而不是用于释放任何内存或类似的东西。如果您想停止计时器,请调用 clearTimeout - 如果您希望它完成或已经完成,则无需这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多