为什么 console.log(1)永远在这里执行:
var interval = setInterval(function() {
if (true) {
clearInterval(interval);
console.log(1);
}
}, 100);
答案 0 :(得分:2)
这取决于您执行此代码的范围。
如果interval
在其范围内是唯一的 - 无论是全局范围还是函数范围 - 那么这将按预期工作。
但是,如果你在循环中执行此代码(例如),则每次迭代都会有一些新的间隔覆盖 interval
,从而破坏了clearInterval
除最后一次setInterval
电话外,呼叫所有人:
for (var i = 0; i < 3; i++) {
var interval = setInterval(function() {
if (true) {
clearInterval(interval);
console.log(1);
}
}, 100);
}
// ^ will give you one single console log entry,
// and two more console log entries per second forever
答案 1 :(得分:1)
似乎您的变量interval
再次被使用。如果我运行您提供的代码,它将按预期工作。我猜用户Lightness已经给出了很好的解释,他还提供了一些代码,其中“闭包问题”很明显(这也导致了你的问题)。我只想添加额外的信息。如果你想在loop + setInteval中使用你的代码,你可以执行以下操作:
for (var i = 0; i < 3; i++) {
var o = {
i: i,
interval: null,
timer: function() {
if (true) {
clearInterval(this.interval);
console.log(this.i);
}
}
};
o.interval = setInterval(o.timer.bind(o), 1000);
}
我希望它对某人有用。