for(var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
// >> 5
// >> 5
// >> 5
// >> 5
// >> 5
Создавая переменную i в цикле (через var) мы обьявляем ее в области видимости той ф-ции в которой находится цикл. При прохожнении каждой итерации создаются таймауты и инкрементится переменная i. В момент завершения цикла переменная i будет равна 5 и все логи одновременно через одну секунду выведут 5.
- Цикл отработал
- 5 таймаутов создано
- Переменная
iравна5 - Спустя секунду выполняются наши таймауты(пять штук) в которых анонимная ф-ция через замыкание выводит переменную
iкоторая в этот момент уже равна5
for(let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
// >> 0
// >> 1
// >> 2
// >> 3
// >> 4
Каждая итерация цикла создаёт новую переменную i в рамках блока {}, которой присваивается значение из предыдущей итерации +1. let с каждым повторением цикла создает отдельный scope. Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.