2014-01-08 5 views
1

У меня есть следующие функции в для цикла:меняется на интервале устанавливается

loops.push(setInterval(function(){ 
    showNext(i); 
}, 5000)); 

i является индексом для цикла. Однако проблема возникает, когда функция push запускается. i всегда задается последним индексом цикла for, потому что к тому времени, когда вызывается функция интервала, цикл for завершен.

Как я могу сделать интервал получать индекс for-loop, который находится на , теперь, вместо того, чтобы установить его на последний индекс for-loop?

ответ

2

Добавив закрытие. Как это:

for(var i=0; i<n; i++){ 
    (function(i){ 
     loops.push(setInterval(function(){ 
     showNext(i); 
     }, 5000)); 
    })(i); 
} 

Таким образом, внутренняя i отличается от внешнего. Это то же самое, но более понятно:

for(var i=0; i<n; i++){ 
    (function(x){ 
     loops.push(setInterval(function(){ 
     showNext(x); 
     }, 5000)); 
    })(i); 
} 

Таким образом, есть другой x за цикл цикла. Поскольку он больше не используется, он не перезаписывается.

Приветствия, от Ла-Пас, Боливия

+0

Блестящий! Спасибо! – David

+0

Я соглашусь, как только это позволит мне. – David

+0

Добро пожаловать. Рад, что это помогло –

1

Вы можете связать i в качестве аргумента в вашей функции:

loops.push(setInterval(showNext.bind(this, i), 5000)); 

Fiddle

Вы уверены, что с помощью setInterval вместо setTimeout?

+0

Да, я уверен, что хочу использовать setInterval. Я зацикливаю карусель изображений. – David

0

Использование Function.prototype.bind() намного прост:

// the first parameter of bind is not important in this case. 
loops.push(setInterval(showNext.bind(this, i), 5000)); 

.bind Примечание нужен Polyfill для старых браузеров.

Смежные вопросы