SetInterval в цикле for, передавая параметры - PullRequest
1 голос
/ 19 марта 2012
    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 Ответ

4 голосов
/ 19 марта 2012

На самом деле ваш код ссылается на одну и ту же переменную temp во всех итерациях цикла for. Таким образом, все экземпляры функций setInterval получают одну и ту же ссылку и, следовательно, одно и то же значение (во время выполнения функции, переданной в setInterval).

Чтобы решить эту проблему, используйте что-то вроде следующей функции для создания обратного вызова для setInterval

function createCB( val ) {
  return function(){
    changeColor( val );
  };
}

и измените ваш setInterval вызов соответственно на

setInterval( createCB( temp ),300 );

Вызов дополнительной функции фактически создает копию вашего значения temp и, таким образом, передает каждому значению различное значение changeColor.

...