# Javascipt. For. Var. Let. Closure. Event loop. ## var ``` 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` ## let ``` for(let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } // >> 0 // >> 1 // >> 2 // >> 3 // >> 4 ``` `let` создает переменную в рамках блока `{}`. Иначе говоря `let` с каждым повторением цикла создает отдельный `scope`. Каждому повторению цикла соответствует своя независимая переменная `let`. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации. Исходя из этого `i` создается с каждым циклом в отельном скоупе и с каждым разом равна новому значению инкремента что собственно и будет выведено в лог.