据我所知,我们可以将clearInterval as:
var go = setInterval(function() {
console.log("go");
}, 5000);
clearInterval(go);

但由于某种原因,在我的javascript代码中,我有两次相同的变量分配setInterval。现在,即使我多次清除它也不会被清除。示例:
var go = setInterval(function(){
console.log("go");
}, 1000);
var go = setInterval(function(){
console.log("go");
}, 1000);
clearInterval(go);
clearInterval(go);
clearInterval(go);
clearInterval(go);

我的问题是:
这里发生了什么? javascript如何处理这种情况? go
有什么问题?为什么它没有被清除?
答案 0 :(得分:1)
你做不到。您已覆盖之前的计时器ID。它输了。
只有第二个时间间隔(当前存储在变量中的ID)将被清除,无论您拨打clearInterval
的频率如何。
您将需要多个变量(或定时器的数据结构,例如数组):
var go1 = setInterval(function(){
console.log("go 1");
}, 1000);
var go2 = setInterval(function(){
console.log("go 2");
}, 1000);
clearInterval(go1);
clearInterval(go1); // nothing will happen
clearInterval(go2);
答案 1 :(得分:1)
正如一些评论中所述,您在此处所做的是重新分配您的go
变量。每次调用setInterval
都会返回不同的ID。一旦您重新分配了引用该值的唯一变量,之前的值就会丢失。
当涉及到唯一标识符时,它会保留一个可扩展的列表,以便您不会丢失该进程的标识符。我建议创建一个数组并将每个新id推送到它(使用它就像一个堆栈),这样它们都在一个地方,但仍然可以单独引用:
var intervalIDs = []; //we would want something like this to be a global variable
//adding IDs to the array:
intervalIDs.push(window.setInterval(function(){console.log("go 1");}, 1000));
intervalIDs.push(window.setInterval(function(){console.log("go 2");}, 1000));
//now we know we can find both IDs in the future
//clearing an interval:
window.clearInterval(intervalIDs.pop()); //takes the last ID out of the array and uses it to stop that interval. this could be done in a for loop to clear every one you've set using the above method.
//OR if you happen to know the index (in the array) of a specific interval id you want to clear:
var index = /*index number*/;
window.clearInterval(intervalIDs.splice(index, 1)[0]);
重点是确保您保持引用间隔的方式(或其他任何类似行为的方式)。