为什么setInterval不会停止?

时间:2013-12-30 00:59:19

标签: javascript

为什么 console.log(1)永远在这里执行:

var interval = setInterval(function() {
    if (true) {
        clearInterval(interval);

        console.log(1);
    }
}, 100);

2 个答案:

答案 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);
}

DEMO

我希望它对某人有用。