Javascript 如何将变量传递给setTimeout函数?

Javascript 如何将变量传递给setTimeout函数?,javascript,Javascript,我试图设置五个交错的函数调用(间隔一秒钟)。那部分很好用。不起作用的是,我不能将值0到4传递给回调函数。每次只经过“5”。我似乎不明白为什么以及如何修复它 代码: 预期结果: 0 1 2 3 4 使用lambda/函数表达式捕获当前值。比如说 for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) { var doCall = function (j) { setTimeout(function()

我试图设置五个交错的函数调用(间隔一秒钟)。那部分很好用。不起作用的是,我不能将值0到4传递给回调函数。每次只经过“5”。我似乎不明白为什么以及如何修复它

代码:

预期结果:

0
1
2
3
4

使用lambda/函数表达式捕获当前值。比如说

for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) {
  var doCall = function (j) {
    setTimeout(function() { callback(j); }, loadDelay);
  }
  doCall(i);
}

我的解决方案之所以有效,是因为它引入了一个新函数,从而为
j
引入了一个新的变量生存期。这将在函数中保存
i
的当前值,以便在
setTimeout
回调中使用setTimeout会产生一些奇怪的范围问题。旨在解决此类困惑,这也有效[更新]:

function callback(num) {
    console.log(num);
}

for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000) {
    Frame(function(next, i){
        setTimeout(function() { callback(i); }, loadDelay);
        next();
    }, i);
}
Frame.init();
函数回调(num){
console.log(num);
}
对于(变量i=0,加载延迟=1000;i<5;++i,加载延迟+=1000){
框架(功能(下一步,i){
setTimeout(函数(){callback(i);},loadDelay);
next();
},i);
}
Frame.init();

由于变量作用域,您需要一个闭包才能通过
i
。请查看,并获取有关闭包的一些好信息

function callback(num)
{
    console.log(num);
}

for (var i = 0, loadDelay = 1000; i < 5; ++ i, loadDelay += 1000)
    setTimeout((function(num){return function(){
           callback(num);
        }
    })(i), loadDelay);​
函数回调(num)
{
console.log(num);
}
对于(变量i=0,加载延迟=1000;i<5;++i,加载延迟+=1000)
setTimeout((函数(num){return函数(){
回调(num);
}
})(i) ,装载延迟);​

这是因为您创建了一个闭包。因此,传递给
setTimeout
的函数共享相同的
i
实例。在支持标准(非IE)的浏览器中,您可以:

setTimeout(callback, loadDelay, i);
见:

否则,您必须实际将参数绑定到函数:

setTimeout(callback.bind(undefined, i), loadDelay);
见:

如果浏览器不支持ES5
bind
方法,则可以实现上面链接中的垫片,或者手动执行以下操作:

setTimeout(function(index){
    return function() { callback(index) }
}(i), loadDelay);
但是我要说的是,使用
bind
更具可读性,而且实现垫片是值得的。实际上,您可以使用:


在本机不支持es5的浏览器中添加es5功能(如果可能)。

增加回调中的值。由于setTimeout是异步的,这就是为什么您总是使用5。太好了!漂亮&短,优雅。适用于Firefox和Chrome。
setTimeout(callback, loadDelay, i);
setTimeout(callback.bind(undefined, i), loadDelay);
setTimeout(function(index){
    return function() { callback(index) }
}(i), loadDelay);