Выполнение, не ожидаемое от setTimeout Javascript

Для следующего преподавания:

for(var i = 0; i<3; i++){  
     alert("Primero->"+i);

     setTimeout(function() {
        alert("Segundo->"+i);
      }, (i+1)*600);

}

Выход - следующий:

Сначала-> 0

Сначала-> 1

Сначала-> 2

Секунда-> 3

Секунда-> 3

Секунда-> 3

Я нуждаюсь в том, чтобы использовать индекс i в alert.

Я не понимаю очень хорошо выполнение setTimeout, и потому что Вы надеетесь закончить for, чтобы начинать выполнение.

3
задан 23.10.2016, 13:54
2 ответа

Ты нуждался бы в том, чтобы переместить его функцию как callback в твою функцию setTimeout. Что-то сходное с этим:

for(var i = 0; i<3; i++){
     alert("Primero->" + i);
     setTimeout(muestraValores, (i+1)*600, i);
}

function muestraValores(i){
  alert("Segundo->" + i);
}

Параметры ты был бы должен перемещать их его как третий аргумент для того, чтобы setTimeout уважайте отсрочку, выполнив функцию.

2
ответ дан 24.11.2019, 12:58

Это ошибка, известная в качестве Closure внутри loop, важного, который есть, что знание состоит в том, что он случается, когда ты будешь верить в функцию внутри цикла for, и ты используешь в функции iterador

, Есть несколько способов это решать. В ECMAScript 2015, ты можешь использовать let в for и функционируй без проблем (let из-за var)

for(let i = 0; i<3; i++){  
     alert("Primero->"+i);

     setTimeout(function() {
        alert("Segundo->"+i);
     }, (i+1)*600);
}

Другой выбор состоит в том, чтобы завертывать функцию, созданную в IIFE (функция выполнимый автомобиль).

for(var i = 0; i<3; i++){  
     alert("Primero->"+i);

     (function(i) { 
        setTimeout(function() {
           alert("Segundo->"+i);
        }, (i+1)*600) 
      })(i);
}

В конце концов, ты можешь, как он говорит ответ @Error404, использовать одну funciГіn , объявленная вне for

Нуждалась в том, чтобы использовать индекс i в alert. Я не понимаю очень хорошо ее ejecuciГіn setTimeout, и потому что он надеется закончить for, чтобы начинать ее ejecuciГіn.

Проблема surje из-за природы переменных var из javascript (caracterista, не вирус). Эти переменные "живут" в лексической области верхней функции. Поэтому он решен let (которые он двигает в переменную в область локальной функции, в этом случае for) и с другими методами, которые создают новую функцию, которую скрывает varianble первоначальный i.

4
ответ дан 24.11.2019, 12:58

Теги

Похожие вопросы