Skip to content

Instantly share code, notes, and snippets.

@zmts
Last active January 28, 2025 14:48
Show Gist options
  • Save zmts/293d05ebc4941f64fde84f0144d4554b to your computer and use it in GitHub Desktop.
Save zmts/293d05ebc4941f64fde84f0144d4554b to your computer and use it in GitHub Desktop.
Javascipt. For. Var. Let. Closure. Event loop.

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

Каждая итерация цикла создаёт новую переменную i в рамках блока {}, которой присваивается значение из предыдущей итерации +1. let с каждым повторением цикла создает отдельный scope. Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment