小编典典

循环传递函数给setTimeout:总是最后一个值?

javascript

我正在尝试使用setTimeout执行匿名函数,该函数会将信息传递给我,但出现了问题。这个(硬编码版本)可以正常工作:

setTimeout(function(){alert("hello");},1000);
setTimeout(function(){alert("world");},2000);

但是我试图从数组中获取hello和world并将其传递给函数,而无需(a)使用全局变量,以及(2)使用eval。我知道如何使用globals或eval做到这一点,但是如果没有我怎么做。这是我想做的事情(但我知道这行不通):

var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
    setTimeout( function(){alert(strings[i]);}, delay);
    delay += 1000;
}

当然,字符串[i]将脱离上下文。如何在没有eval或globals的情况下将字符串[i]传递给该匿名函数?


阅读 414

收藏
2020-05-01

共1个答案

小编典典

这是非常重复的“如何在闭包中使用循环变量”问题。

规范的解决方案是调用一个函数,该函数返回绑定到循环变量当前值的函数:

var strings = [ "hello", "world" ];
var delay = 1000;
for(var i=0;i<strings.length;i++) {
    setTimeout(
        (function(s) {
            return function() {
                alert(s);
            }
        })(strings[i]), delay);
    delay += 1000;
}

外部定义function(s) { ... }创建一个新作用域,该作用域s绑定到所提供参数的当前值,即 内部
作用域strings[i]可用的范围。 __

2020-05-01