我想用不同的方式命名许多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)
    );
}


这将创建一个immediately-invoked function expression (IIFE),将“ i”的值“捕获”为功能范围变量。

09-20 08:06