在for循环中设置SetInterval,传递参数

时间:2012-03-19 14:56:37

标签: javascript html setinterval

    var flag = true;
     function changeColor (element) {
        if(flag==true){
           document.getElementById(NAME+element).style.background="red";
           flag=false;
       }
       else if (flag==false){
           document.getElementById(NAME+element).style.background="white";
           flag = true;
     }
   }

    var temp;
    for(var i=0;i<elements_array.length;i++)
    {
      alert("VAL="+elements_array[i]);
      temp = elements_array[i];

      setInterval(function() { changeColor(temp); } ,300);
    }

以上代码仅适用于最后一个值。我正在尝试更改从整数数组(elements_array)获得的特定单元格的颜色。

在警报中我正确得到数组值,比如2,5,8。但只有第8个(最后一个)正在改变颜色。

但是,如果我将值硬编码为以下所有单元格都会改变颜色。

 setInterval(function() { changeColor(2); } ,300);
 setInterval(function() { changeColor(5); } ,300);
 setInterval(function() { changeColor(8); } ,300);

关于为什么循环不起作用的任何想法?谢谢

1 个答案:

答案 0 :(得分:4)

实际上,您的代码在temp循环的所有迭代中引用相同的for变量。这样,setInterval函数的所有实例都会传递相同的引用,从而传递相同的值(在执行传递给setInterval的函数时)。

要解决此问题,请使用以下函数之类的内容为setInterval

创建回调
function createCB( val ) {
  return function(){
    changeColor( val );
  };
}

并相应地将setInterval电话改为

setInterval( createCB( temp ),300 );

附加函数调用实际上会复制temp值,从而为changeColor的每次调用传递不同的值。