繁体   English   中英

如何将变量添加到setTimeout名称?

[英]How can I add a variable to a setTimeout name?

我想为许多setTimeouts取不同的名称,以便可以分别清除每个setTimeouts。 我尝试了以下方法:

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

http://jsfiddle.net/NU4E8/2/

但是好像我重命名了wordTimeout,然后变量没有关系。 理想情况下,在此示例中,所有setTimeouts在被调用后都将被单独清除。 因此,任何超时都不会显示在日志中。 谢谢。

您无法命名自己的超时时间。 setTimeoutsetInterval返回一个数字ID,必须将其传递给clearTimetout 但是,您可以使用数组或对象来存储超时:

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

或者,如果您需要命名它们,可以这样做:

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

您还应该知道,在编写循环时,所有的超时都将显示“ 4超时被调用”。 这是因为函数是在包含i的闭包中声明的,并且在它们开始执行时,该循环将完成,并且最终值为4(除非该函数在相同范围内被其他代码重复使用)课程)。 您可能想做的是:

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

这将创建立即调用的函数表达式(IIFE) ,该表达式i的值“捕获”为函数范围变量。

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

var timers = [];
for (i = 0; i < 5; i++) {
    timers.push(setTimeout(function () {
        console.log(i + ' timeout called');
    }, 2000));
    console.log(i);
}

然后使用timers [0]访问i=0的定时器参考


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

创建一个数组,您将在其中存储每个setTimeout调用返回的数字。

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

然后,当您需要清除时,您将拥有由i存储的超时编号。

.bind技巧是因为i的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM