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

Какое значение хранит переменная var до её объявления?

2.0 Middle🔥 201 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

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

Значение переменной var до её объявления

В контексте JavaScript с использованием ключевого слова var, переменная до её явного объявления в коде хранит специальное значение undefined. Это происходит из-за механизма hoisting (поднятие), характерного для переменных, объявленных через var.

Как работает hoisting с var?

На этапе компиляции (перед выполнением кода) JavaScript "поднимает" объявления переменных var вверх их области видимости (function scope). Однако, инициализация (присвоение значения) остаётся на своём месте в коде.

Пример, иллюстрирующий процесс:

console.log(myVar); // Выведет: undefined
var myVar = 10;
console.log(myVar); // Выведет: 10

С точки зрения интерпретатора, этот код преобразуется следующим образом:

var myVar;          // Объявление поднято, значение - undefined
console.log(myVar); // undefined
myVar = 10;         // Инициализация происходит здесь
console.log(myVar); // 10

Ключевые особенности:

  • Доступ до объявления: Переменной можно обратиться до строки с её объявлением, и это не вызовет ошибку ReferenceError (в отличие от let и const). В такой момент она будет иметь значение undefined.
  • Область видимости: var имеет function scope (область видимости в пределах функции), а не block scope. Если переменная объявлена внутри блока { } (например, в условии if или цикле for), она всё равно "поднимается" в начало окружающей её функции или в глобальную область видимости.

Пример с областью видимости и hoisting:

function testHoisting() {
    console.log(innerVar); // undefined, а не ошибка!
    if (true) {
        var innerVar = "Я внутри блока!";
    }
    console.log(innerVar); // "Я внутри блока!"
}
testHoisting();
// console.log(innerVar); // ReferenceError: innerVar is not defined (она function-scoped)

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

let и const также подвержены hoisting'у, но их поведение принципиально отличается:

  • Они попадают в "временную мёртвую зону" (Temporal Dead Zone, TDZ) – период между началом области видимости и моментом объявления.
  • Попытка обратиться к переменной let или const до объявления вызовет ReferenceError.
console.log(letVar); // ReferenceError: Cannot access 'letVar' before initialization
let letVar = 5;

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

Практические выводы и рекомендации

  • Избегайте использования var в современном JavaScript (ES6+). Использование let и const делает код предсказуемее, предотвращая ошибки, связанные с hoisting'ом и областью видимости.
  • Всегда объявляйте переменные до их использования. Это правило является best practice и страхует от неявного поведения.
  • undefined – это значение по умолчанию для "поднятой" переменной var. Оно отличается от состояния "переменная не объявлена вообще" (что вызывает ReferenceError).

Таким образом, значение переменной var до её объявления в коде всегда равно undefined благодаря механизму hoisting, который резервирует для неё место в памяти на этапе создания контекста выполнения.