вызов setTimeout с циклом for

Я написал функцию, которая изменяет расположение CSS в div

Я успешно использовал setTimeout для вызова функции через определенный интервал

ТЕПЕРЬ, что я пытаюсь сделать, это вызвать функцию на 28 разных делениях на одной странице, каждая со своей скоростью.

я думал, что я мог бы сделать это с помощью цикла for следующим образом:

<code>for (var x = 0; x < 28; x++)
   { setInterval(function(){changeDirection(divlist[x])}, divs[divlist[x]].speed);}
</code>

используя объект 'divs' где хранятся скорость и идентификатор

Единственный способ заставить их всех двигаться против таймера - это вызвать setInterval 28 раз, как ...

<code>setInterval(function(){changeDirection(divlist[1])}, divs[divlist[1]].speed);
setInterval(function(){changeDirection(divlist[2])}, divs[divlist[2]].speed);
setInterval(function(){changeDirection(divlist[3])}, divs[divlist[3]].speed);
setInterval(function(){changeDirection(divlist[4])}, divs[divlist[4]].speed);....etc
</code>

цикл for НЕ работает ...

у кого-нибудь есть идеи почему? и есть ли способ вызвать setInterval для многих различных функций с таким циклом

 Bergi29 авг. 2012 г., 18:00
возможный дубликатsetTimeout in a for-loop and pass i as value

Ответы на вопрос(3)

Мой подход к этим функциям.

var i = -1;
(function cssPositioning() {
  i++;
  if ( i < 28 ) {
            changeDirection(divlist[i]);
    setInterval(cssPositioning, divs[divlist[i]].speed);
  }
})();
Решение Вопроса

Вам нужно "привязать" значение вашего итератора цикла, в противном случае он продолжает увеличиваться, и все интервалы влияют на 29-й, который не существует.

for(var x=0; x<28; x++) {
    (function(x) {
        // code goes here
    })(x);
}

Однако 28 таймеров на одной странице - это действительно плохая идея. Попробуйте переписать код так, чтобы у вас был только один интервал, который вычисляет новые позиции на основе значения скорости.

 pepperdreamteam05 апр. 2012 г., 19:13
отличный ответ ... спасибо! Мне любопытно узнать причину, по которой таймеры плохие, так как кажется, что они работают нормально с точки зрения производительности
 05 апр. 2012 г., 19:31
Firefox ужасно отстает, когда у меня одновременно работает всего шесть таймеров. Или, по крайней мере, в последний раз я проверял.

Основываясь на объяснениях @ Kolink, вы можете попробовать

for (var x = 0; x < 28; x++){ 
   setInterval(function(){
     var local = x;  //anchor the variable  
     changeDirection(divlist[local])}, divs[divlist[local]].speed);
   });
}

Надеюсь это поможет.

Ваш ответ на вопрос