Показать сообщение отдельно
  #1 (permalink)  
Старый 01.09.2019, 22:50
Интересующийся
Отправить личное сообщение для Devero97 Посмотреть профиль Найти все сообщения от Devero97
 
Регистрация: 03.08.2019
Сообщений: 17

Замыкания в цикле
Здравствуйте. Помогите разобраться с такой проблемой. Есть код:

for(var i = 0; i <= 5; i++){
 setTimeout () {function(){
  console.log(i)
 }, i*1000}
}


1. Почему когда происходит выполнение кода, в консоль записывается 5 шестерок, а тайм-аут срабатывает именно каждую секунду? Тут вопрос не про вывод на консоль шетерок, а именно работа тайм-аута. Каким образом секунда увеличивается постепенно, если логически, после выполнения цикла, вместо i * 1000 должно подставиться 6 * 1000?

Следующий код:

for(var i = 0; i <= 5; i++){
 (function(){
   var j = i;
   setTimeout () {function(){
    console.log(j)
   }, j*1000}
  }())
}


2. Почему при таком варианте, каким-то образом каждая итерация запоминается в переменную j? Я понимаю что это замыкание и тайм-аут видит по замыканию сохраненной значение в переменной j каждый раз. Но вот как это происходит? Вот цикл завершился и записал в j шестерку. А как тайм-аут запомнил, что там были числа 0,1 и т.д.?
Или тут работает отложенный вызов или какой-то стек создается? Тоесть сначало в j присваивается 0 а затем подставляется в тайм-аут функцию и она выполняется и так далее. Но ведь цикл завершается гораздо быстрее чем 1 секунда.
Помогите разобраться.
Ответить с цитированием