2

我不太确定这个问题的机制,但我试图将一个 setTimeout 设置为一个变量 ID,我可以使用 clearTimeout 轻松取消它。但是,如果 setTimeout 在 clearTimeout 之前被触发两次,事情就会变得古怪。

示例: http ://www.w3schools.com/js/tryit.asp?filename=tryjs_settimeout2

单击“Try It”两次,然后单击“Stop the Alert”两次,设置超时的功能仍然被调用。同样,我不确定为什么 Try It 会触发该函数两次,因为该事件被保存到一个被覆盖的变量中。

知道这里发生了什么吗?

4

1 回答 1

7

就像 MCL 解释的那样,您正在失去对先前超时的引用,因为新的分配将覆盖它。

您可以做的是将超时放入数组中:

var myTimer = [];

function myFunction () {
    myTimer.push(setTimeout(function(){alert("Hello")},3000));
}

function myStopFunction () {
    clearTimeout(myTimer.pop());
}

这样您可以在单击Stop the alert按钮时取消上次设置的超时。

jsFiddle的现场演示。

于 2013-06-19T19:38:34.997 回答