Как инициализируются переменные let и var в цикле for?
У нас есть цикл for.
Каким образом там переменные создаются и инициализируются?
Почему получается так, что var создается как бы вне цикла и получает только конечный результат для всех console.log(i)
А let у нас присваивает каждому отдельно?
Егор Живагин, var обрабатывается в начале заданной функции
По умолчанию он undefined в таком случае
Но почему в цикле в итоге он получает конечный результат var для всех итераций, а let для каждой отдельно?
Т.е. как именно проходит процесс создание - изменение - присвоение в цикле
Torento20345, приведите код, и комментариями отметьте строки, где ожидания расходятся с суровой действительностью. Иначе как-то беспредметно «ну все же понимают о чём речь» (нет)
var i == undefined
for(var i = 0; i < 3; i++) {
setTimeout(() => console.log(j), 0);
// var i навсегда останется в памяти
}
i == 3
console.log(i == 3)
for(let i = 0; i < 3; i++) {
i = 0; // 1 строка
setTimeout(() => console.log(j), 0); // 2 строка
// 1 и 2 строка относятся к одному блоку и let = 0 будет жить, пока таймаут не отработает, а уже после блок удалится?
}
i == error
console.log(i == error)
Torento20345, про «подъём наверх» декларации var вы разобрались?
// начало файла
// какой-то код
for (var i = 0; ...
// ------------------ то же, что:
// начало файла
var i;
// какой-то код
for(i = 0; ...
Декларация let блочная. У for «блок» это тело цикла между фигурными скобками.
Вы всё поняли примерно правильно. Во втором примере, с let, создаваемая стрелочная функция тащит с собой «окружение», в котором присутствует копия значения i
Я не нашёл там ответ, почему сперва var станет 3 допустим в цикле, а уже потом будет происходить вывод console.log(i), где она уже 3, а не по очереди будет вывод.
Как будто первое действие цикла это понять сколько раз он выполнится, а уже потом выполняться имея уже у i конечное значение 3.
Lynn «Кофеман», я про классический for(var i = 0; i < 3; i++) { console.log(i)}
Почему мы сразу получим i == 3, а уже потом будем выполнять тело цикла?
И так же, почему с let мы все же выполняем тело цикла в текущее время, а не как с var уже с результатом конечным счёта?
Понятно, что var объявлено выше цикла даже, но почему именно сразу получим 3, а уже потом будет выводить консоль?