for (var i = 0; i < 3; i++) {
console.log( i );
}
console.log( i )
если в цикле я понимаю, почему выводит 0, 1, 2, то после цикла не понимаю, почему ответ “3”.
объясните, пожалуйста, новичку!
for (var i = 0; i < 3; i++) {
console.log( i );
}
console.log( i )
если в цикле я понимаю, почему выводит 0, 1, 2, то после цикла не понимаю, почему ответ “3”.
объясните, пожалуйста, новичку!
Переменные, объявленные с помощью var
“живут”/видны в рамках функции. По-заумному это называется лексическая область видимости (lexical scope). По этим словам можно нагуглить альтернативные объяснения.
Механика кода что ты кинула следующая. Переменная, объявленная в цикле изменяется с каждой итерацией. После завершения цикла переменная продолжает существовать ибо была объявлена с помощью var
.
Если использовать объявление переменной через let
, то она будет видна/доступна только в рамках “блока кода”. Т.е. переменная объявленная в блоке цикла будет существовать только в его рамках. Возможно ты ожидала именно это поведение. По-заумному этот механизм называется блочная область видимости (block scope).
for (let i = 0; i < 3; i++) {
console.log( i )
}
console.log( i ) // Ошибка потому что i не объявлена за переделами цикла
Код выше надо запускать в новом окне браузера/консоли чтобы увидеть ошибку. Иначе если ты уже имеешь объявленную i
от предыдущих запусков, то ошибку не увидишь.
спасибо, стало понятней
Дмитрий уже ответил. А я сам для себя добавлю.
Ваша запись равнозначна такой:
function () {
var i = undefined;
for (i = 0; i < 3; i++) {
console.log(i);
}
console.log(i);
}
спасибо за ответ!
Ну если вопрос в области видимости, то тут уже все понятно из предыдущих комментариев :)
А если удивляет, почему все же получается “3”, то тогда почему не удивляет что на первом шаге “0” - ?
не удивляло, поскольку с 0 начиналось. следующий шаг 1, и последний 2 (поскольку i<3, то “3” уже не будет. я уже много прочитала литературы, немножко понимаю))
Ну вот все логично же
Шаг_0: Инициализация счетчика + проверка условия если true то выполение блока в {…}
Шаг_1: Изменение счетчика + проверка условия если true то выполение блока в {…}
.
.
.
Шаг_N: Изменение счетчика + проверка условия если false выход из цикла
А дальше актуальны комменты про область видимости :)