11

刚刚在我们的应用程序中找到了这个代码片段。我想知道第一行是否是多余的——如果变量立即被覆盖,是否需要对变量调用 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

4 回答 4

18

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

我希望这是一些帮助。

于 2012-04-11T16:35:47.650 回答
6

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

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


仅供参考,看起来你可以缩短代码一点......

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

匿名函数什么也没得到。

于 2012-04-11T16:04:16.793 回答
4

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

clearTimeout存在取消现有定时器,即擦除定时器并防止其回调函数被调用。

于 2012-04-11T16:07:28.457 回答
1

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

于 2012-04-11T16:04:06.447 回答