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

标签 javascript settimeout

我想以不同的方式命名许多 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 timeout called”;这是因为这些函数是在包含 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 的值“捕获”为函数范围变量。

关于javascript - 如何将变量添加到 setTimeout 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21690247/

相关文章:

javascript - 循环内的 DOM 操作发生得太快

Javascript:如何清除非全局(封闭)setTimeout?

jquery - 如何在 jQuery .each() 的每次迭代之间添加暂停?

Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么?

javascript - 如何在发出Ajax请求时只等待1秒,但等待时间后不取消请求?

javascript - 将这些字符中的任何一个替换为空 : ''

javascript - 尽管绑定(bind),React onClick 事件仍会产生 : "Uncaught TypeError: Cannot read property of undefined",

javascript - 鼠标悬停时获取对象的标签、id、类

javascript - push() 方法在 JavaScript 中无法正常工作

javascript - 如何合并 MongoDB 查找查询的输出?