Javascript 如何向setTimeout名称添加变量?

Javascript 如何向setTimeout名称添加变量?,javascript,settimeout,Javascript,Settimeout,我想以不同的方式命名许多设置超时,这样我可以逐个清除每个设置超时。我尝试了以下方法: for(i=0; i<5; i++){ var wordTimeout = i + "_T_i_m_e_o_u_t"; clearTimeout( wordTimeout ); var wordTimeout = setTimeout( function() { console.log( i + ' timeout called' );}, 2000);

我想以不同的方式命名许多设置超时,这样我可以逐个清除每个设置超时。我尝试了以下方法:

for(i=0; i<5; i++){

    var wordTimeout = i + "_T_i_m_e_o_u_t";     
    clearTimeout( wordTimeout ); 

    var wordTimeout = setTimeout( function() { console.log( i + ' timeout called' );}, 2000); 
    console.log(i);
}

但是看起来我重命名了wordTimeout,然后变量就不重要了。理想情况下,在本例中,所有设置超时在调用后都会被单独清除。所以日志中不会显示超时。谢谢

您可以创建一个数组,并使用索引作为键将计时器引用存储在那里

var timers = [];
for (i = 0; i < 5; i++) {
    timers.push(setTimeout(function () {
        console.log(i + ' timeout called');
    }, 2000));
    console.log(i);
}
然后使用计时器[0]访问i=0的计时器参考

您还有另一个常见问题,即在循环中使用闭包变量


你不能说出你自己的超时时间。setTimeout和setInterval返回一个数字ID,这是必须传递到clearTimetout的内容。但是,您可以使用数组或对象来存储超时:

var timeoutIds = [];
for(var i=0; i<5; i++){
    timeoutIds.push(setTimeout(function(){ /* ... */ }));
}

这将创建一个数组,该数组将i的值捕获为函数范围变量。

创建一个数组,用于存储每个setTimeout调用返回的数字

然后,当您需要进行清除时,i将存储超时数


.bind技巧是因为i的作用域。

我想你想使用数组?记住i的作用域。@Bergi该死的。。。没有注意到绑定技巧将范围和上下文混合在一起…看起来很短,但相当难看。
var timeoutIds = {};
for(var i=0; i<5; i++){
    timeoutIds['timeout_' + i] = setTimeout(function(){ /* ... */ });
}
var timeoutIds = [];
for(var i=0; i<5; i++){
    timeoutIds.push(
        (function(i){
            // i now captured as a function-scope variable
            return setTimeout(function(){ console.log(i + ' timeout called'); });
        })(i)
    );
}
var timeouts=[];
for(i=0; i<5; i++){    
    clearTimeout(timeouts[i]);
    timeouts[i]=setTimeout((function(){
        console.log(this.i+' timeout called');
    }).bind({i:i}),2000); 
    console.log(i);
}