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

Sea*_*son 9 javascript settimeout

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

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(function () { countdownHandler() }, MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

我的预感是"是的,你需要调用clearTimeout"因为我无法想象为什么只有将timeout变量设置为null才能存在clearTimeout方法.

我想更好的问题是:

var timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);
timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)

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

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

我希望这是一些帮助.


小智 6

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

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


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

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(countdownHandler, MILLISECONDS);
}
Run Code Online (Sandbox Code Playgroud)

匿名函数没有获得任何结果.

  • @SeanAnderson是的,它仍然会被解雇 - 覆盖句柄并不会阻止原始计时器被触发 - 这就是`clearTimeout`的用途. (6认同)
  • @SeanAnderson:`setTimeout`返回的值只是一个`Number`原语.它没有超出任何其他数字的行为. (2认同)