Блочная область видимости

Блочная область видимости — это когда переменная доступна только внутри блока кода, заключённого в фигурные скобки {} — например, внутри if, for, while, или любого другого блока.

Переменные, объявленные с let и const, привязаны к блоку, а не к функции. Они не видны за пределами этого блока.

Пример:

if (true) {
  let isActive = true;
  const theme = "dark";
}

console.log(isActive); // ошибка: isActive is not defined
console.log(theme);    // ошибка: theme is not defined

Здесь isActive и theme существуют только внутри if. Как только блок завершён — переменные уничтожаются (в смысле недоступны).

То же работает с циклами:

for (let i = 0; i < 3; i++) {
  console.log(i); // 0, 1, 2
}

console.log(i); // ошибка: i is not defined

В отличие от var, здесь i не выходит за пределы цикла — это предсказуемо и безопасно.

Особенность: let в цикле for

С let в цикле for каждая итерация создаёт новую переменную. Это важно при использовании замыканий.

Пример с var — проблема:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// Выведет: 3, 3, 3 — потому что i — одна переменная, и к моменту запуска setTimeout она = 3

Пример с let — правильно:

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// Выведет: 0, 1, 2 — каждая итерация имеет свою i

Почему так происходит:
let создаёт новую привязку переменной для каждой итерации цикла. var — одну и ту же переменную для всего цикла.

Всегда используйте let и const вместо var.
Они дают точный контроль: переменная существует только там, где вы её объявили — меньше ошибок, проще читать и отлаживать код.