← Назад к вопросам

Какая область видимости у const?

1.3 Junior🔥 241 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Область видимости const

Область видимости (scope) — это диапазон кода, где переменная доступна. Ключевое слово const имеет блочную область видимости (block scope), что в современном JavaScript делает его одним из самых предсказуемых способов объявления переменных.

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

const существует только внутри блока { }, где она объявлена. После закрытия блока переменная перестаёт существовать.

// Глобальная область видимости
const globalVar = "I am global";

function myFunction() {
  // Область видимости функции
  const functionVar = "I am in function";
  
  if (true) {
    // Блочная область видимости
    const blockVar = "I am in block";
    console.log(blockVar); // "I am in block" — доступна
  }
  
  console.log(blockVar); // ReferenceError! — не доступна вне блока
}

console.log(functionVar); // ReferenceError! — не доступна вне функции
console.log(globalVar); // "I am global" — доступна везде

Сравнение с var и let

var — функциональная область видимости

function example() {
  if (true) {
    var oldStyle = "I am var";
  }
  console.log(oldStyle); // "I am var" — доступна! (поднялась на уровень функции)
}

example();
console.log(oldStyle); // ReferenceError! — не доступна вне функции

let — блочная область видимости (как const)

function example() {
  if (true) {
    let modern = "I am let";
  }
  console.log(modern); // ReferenceError! — не доступна вне блока
}

const — блочная область видимости + неизменяемость

function example() {
  if (true) {
    const safe = "I am const";
  }
  console.log(safe); // ReferenceError! — не доступна вне блока
}

Где создаётся блочная область видимости

// 1. Блок if
if (condition) {
  const x = 1; // Область видимости только внутри if
}

// 2. Блок else
else {
  const x = 2; // Другая переменная x с другой областью видимости
}

// 3. Блок switch
switch (value) {
  case 1:
    const x = "one"; // Новая область видимости
    break;
  case 2:
    const x = "two"; // SyntaxError! Нельзя переобъявить в одном switch
}

// 4. Цикл for
for (let i = 0; i < 10; i++) {
  const item = data[i]; // Новая область видимости для каждой итерации
}
console.log(item); // ReferenceError! — не доступна вне цикла

// 5. Цикл while
while (condition) {
  const temp = calculateSomething(); // Область видимости внутри while
}

// 6. Блок try-catch
try {
  const result = riskyOperation();
} catch (error) {
  const message = error.message; // Область видимости только в catch
}

// 7. Просто блок {}
{
  const isolated = "I am isolated";
}
console.log(isolated); // ReferenceError!

Temporal Dead Zone (TDZ)

Одна из отличительных черт const и let — это Temporal Dead Zone. Переменная существует с начала блока, но её нельзя использовать до объявления.

// ReferenceError: Cannot access 'x' before initialization
console.log(x);
const x = 10;

// А с var было бы так:
console.log(y); // undefined (hoisting)
var y = 10;

// Temporal Dead Zone — период от начала блока до объявления
// Это предотвращает случайное использование переменных

Практические примеры

Правильное использование в цикле:

// Неправильно — забыли, что const в цикле пересоздаётся
for (let i = 0; i < 3; i++) {
  const item = items[i];
}
console.log(item); // ReferenceError

// Правильно — понимаете область видимости
const items = [1, 2, 3];
items.forEach((item) => {
  console.log(item); // item доступна только внутри callback'а
});

Область видимости в модулях:

// module.js
const secret = "This is secret"; // Область видимости этого модуля
const public = "Export this";

export { public }; // Только public экспортируется

// Другой файл
import { public } from './module.js';
console.log(secret); // ReferenceError! — не доступна

Избежание ошибок:

// Ошибка — переобъявление в одном блоке
{
  const x = 1;
  const x = 2; // SyntaxError: Identifier 'x' has already been declared
}

// Правильно — разные блоки, разные области видимости
{
  const x = 1;
}
{
  const x = 2; // OK
}

Важные правила

1. const не может быть переобъявлена:

const name = "John";
const name = "Jane"; // SyntaxError!

2. const должна быть инициализирована при объявлении:

const x; // SyntaxError: Missing initializer
const y = undefined; // OK

3. const защищает от переприсваивания, но не от мутации:

const obj = { name: "John" };
obj.name = "Jane"; // OK! — объект мутирован
obj = { name: "Jane" }; // TypeError! — нельзя переприсвоить

const arr = [1, 2, 3];
arr[0] = 99; // OK! — массив мутирован
arr = []; // TypeError! — нельзя переприсвоить

Рекомендации

Используй const по умолчанию:

  • Безопаснее всего
  • Явно показывает, что переменная не переприсваивается
  • Блочная область видимости предотвращает ошибки

Используй let, если нужно переприсвоить:

let counter = 0;
for (let i = 0; i < 10; i++) {
  counter += i;
}

Избегай var в современном коде:

  • Функциональная область видимости запутана
  • Hoisting приводит к ошибкам
  • Используй const/let вместо

Вывод: const имеет блочную область видимости, которая ограничивает доступность переменной только текущим блоком кода. Это делает код более предсказуемым и безопасным, поэтому const должна быть твоим первым выбором в современном JavaScript.