Значение переменной в цикле и вне его

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 от предыдущих запусков, то ошибку не увидишь.

1 лайк

спасибо, стало понятней

Дмитрий уже ответил. А я сам для себя добавлю.

Ваша запись равнозначна такой:

function () {
  var i = undefined;
  for (i = 0; i < 3; i++) {
    console.log(i);
  }
  console.log(i);
}
1 лайк

спасибо за ответ!

Ну если вопрос в области видимости, то тут уже все понятно из предыдущих комментариев :)
А если удивляет, почему все же получается “3”, то тогда почему не удивляет что на первом шаге “0” - ?

не удивляло, поскольку с 0 начиналось. следующий шаг 1, и последний 2 (поскольку i<3, то “3” уже не будет. я уже много прочитала литературы, немножко понимаю))

Ну вот все логично же
Шаг_0: Инициализация счетчика + проверка условия если true то выполение блока в {…}
Шаг_1: Изменение счетчика + проверка условия если true то выполение блока в {…}
.
.
.
Шаг_N: Изменение счетчика + проверка условия если false выход из цикла

А дальше актуальны комменты про область видимости :)

1 лайк