Javascript 具有在运行时更改的参数的超时函数

Javascript 具有在运行时更改的参数的超时函数,javascript,parameters,intervals,Javascript,Parameters,Intervals,我正在尝试以下方法: var timeout = 300; var colors = ['aqua', 'limegreen'] for (var i=0; i < 4; ++i) { console.log(colors[i % colors.length]); setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout); } function changeColor(co

我正在尝试以下方法:

var timeout = 300;
var colors = ['aqua', 'limegreen']
for (var i=0; i < 4; ++i) {
    console.log(colors[i % colors.length]);
    setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout);
}

function changeColor(color) {
    console.log(color);
}

好吧,我现在有一个解决办法,有一个有效的时间间隔……但既然我在这里学习……超时是如何完成的?

您遇到了关闭问题;已捕获对
i
值的引用,因此所有函数都包含相同的值。您需要执行以下操作,以便在调用时捕获
i
的引用:

 for(var i = 0; i < 4; i++)
 {
      (function(index)
      {
          setTimeout(function()
          {
              changeColor(colors[index & colors.length]);
          }, index * timeout);
      })(i)
 }
for(变量i=0;i<4;i++)
{
(功能(索引)
{
setTimeout(函数()
{
更改颜色(颜色[索引和颜色.长度]);
},索引*超时);
})(一)
}

当for循环已经结束时,将执行调用
changeColor
的匿名函数。所以它将等于它得到的最后一个值。要防止这种情况,请使用匿名函数包装对setTimeout的调用,从而捕获闭包中所需的值:

for (var i=0; i < 4; ++i) {
    console.log(colors[i % colors.length]);
    (function(i){
        setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout);
    })(i);    
}
for(变量i=0;i<4;++i){
log(颜色[i%colors.length]);
(职能(一){
setTimeout(函数(){changeColor(colors[i%colors.length])},i*timeout);
})(i) );
}

可能的重复当然也可以(至少用模代替&;)。谢谢你,太好了。我应该自己去抓的东西。谢谢你,比约德!
for (var i=0; i < 4; ++i) {
    console.log(colors[i % colors.length]);
    (function(i){
        setTimeout(function() { changeColor(colors[i % colors.length]) }, i * timeout);
    })(i);    
}