我应该在覆盖超时变量之前调用clearTimeout吗?

时间:2012-04-11 16:02:28

标签: javascript settimeout

在我们的应用程序中找到了这段代码片段。我想知道第一行是否是多余的 - 如果它被立即覆盖,是否需要在变量上调用clearTimeout?或者是否有一些我应该注意的情况?

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

我的预感是"是的,你需要打电话给clearTimeout"因为我不能想到为什么只有将timeout变量设置为null才能存在clearTimeout方法。

我想更好的问题是:

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

我现在有两个功能等待大约MILLISECONDS,或只有一个吗?

4 个答案:

答案 0 :(得分:15)

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

你将使用clearTimeout,因为Niko说 - 停止回击被解雇。

插图:

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);
}

我希望这是一些帮助。

答案 1 :(得分:6)

不,如果您确实需要清除它,您只需要调用它。

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


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

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

使用匿名函数没有任何结果。

答案 2 :(得分:3)

  

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

clearTimeout存在于取消现有计时器,即擦除计时器并阻止调用其回调函数。

答案 3 :(得分:1)

clearTimeout用于取消超时,而不是用于释放任何内存或类似内容。如果你想要停止计时器,请调用clearTimeout - 如果你想要它完成或者它已经完成,则没有必要这样做。