我不太确定这个问题的机制,但是我试图将一个setTimeout设置为一个变量ID,我可以使用clearTimeout轻松取消它。但是,如果setTimeout在clearTimeout之前被触发两次,那么事情就会变得很糟糕。
实施例: http://www.w3schools.com/js/tryit.asp?filename=tryjs_settimeout2
单击“Try It”两次然后“Stop the Alert”两次,仍然会调用set timeout的功能。同样,我不确定为什么尝试它会触发该函数两次,因为事件被保存到一个被覆盖的变量。
知道这里发生了什么?
答案 0 :(得分:4)
就像MCL解释的那样,你失去了对先前超时的引用,因为新的赋值会覆盖它。
您可以做的是将超时放入数组:
var myTimer = [];
function myFunction () {
myTimer.push(setTimeout(function(){alert("Hello")},3000));
}
function myStopFunction () {
clearTimeout(myTimer.pop());
}
这样,您可以在点击Stop the alert
按钮时取消上次设置超时。
jsFiddle的现场演示。