Javascript 为什么不停?

Javascript 为什么不停?,javascript,Javascript,为什么console.log(1)永远在这里执行: var interval = setInterval(function() { if (true) { clearInterval(interval); console.log(1); } }, 100); 这取决于执行此代码的范围 如果interval在其范围内是唯一的(无论是全局范围还是功能范围),则这将按预期工作 但是,如果在循环中执行此代码(例如),则在每次迭代中都会使用新的间隔覆盖i

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

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

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

这取决于执行此代码的范围

如果
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
for(变量i=0;i<3;i++){
var interval=setInterval(函数(){
如果(真){
间隔时间;
控制台日志(1);
}
}, 100);
}
//^将为您提供一个控制台日志条目,
//每秒再增加两个控制台日志条目

这取决于执行此代码的范围

如果
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
for(变量i=0;i<3;i++){
var interval=setInterval(函数(){
如果(真){
间隔时间;
控制台日志(1);
}
}, 100);
}
//^将为您提供一个控制台日志条目,
//每秒再增加两个控制台日志条目

这取决于执行此代码的范围

如果
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
for(变量i=0;i<3;i++){
var interval=setInterval(函数(){
如果(真){
间隔时间;
控制台日志(1);
}
}, 100);
}
//^将为您提供一个控制台日志条目,
//每秒再增加两个控制台日志条目

这取决于执行此代码的范围

如果
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
for(变量i=0;i<3;i++){
var interval=setInterval(函数(){
如果(真){
间隔时间;
控制台日志(1);
}
}, 100);
}
//^将为您提供一个控制台日志条目,
//每秒再增加两个控制台日志条目

您的变量
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);
}
for(变量i=0;i<3;i++){
变量o={
i:我,
间隔:空,
计时器:函数(){
如果(真){
clearInterval(这个.interval);
console.log(this.i);
}
}
};
o、 间隔=设置间隔(o.timer.bind(o),1000);
}


我希望它对某些人有用。

似乎您的变量
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);
}
for(变量i=0;i<3;i++){
变量o={
i:我,
间隔:空,
计时器:函数(){
如果(真){
clearInterval(这个.interval);
console.log(this.i);
}
}
};
o、 间隔=设置间隔(o.timer.bind(o),1000);
}


我希望它对某些人有用。

似乎您的变量
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);
}
for(变量i=0;i<3;i++){
变量o={
i:我,
间隔:空,
计时器:函数(){
如果(真){
clearInterval(这个.interval);
console.log(this.i);
}
}
};
o、 间隔=设置间隔(o.timer.bind(o),1000);
}


我希望它对某些人有用。

似乎您的变量
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);
}
for(变量i=0;i<3;i++){