> Что будет при обращении к переменной var до объявления в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: IT-One, Exness, Сбер

Стек: JavaScript

> Пример ответа

Короткий ответ

В JavaScript при обращении к переменной, объявленной через var, до её объявления в коде вы получите undefined, а не ошибку. Это связано с hoisting - механизмом, при котором объявления переменных поднимаются в начало области видимости. Однако инициализация остаётся на месте, поэтому до строки с присваиванием переменная существует, но имеет значение undefined.

Подробное объяснение

Механизм hoisting работает для всех объявлений var, function, class и let/const, но по-разному. Для var поднимается только объявление (declaration), а не инициализация. Это означает, что интерпретатор JavaScript при выполнении кода сначала "видит" все объявления переменных в текущей области видимости, создаёт их со значением undefined, а затем выполняет строки кода по порядку.

Пример:

JAVASCRIPT
console.log(x); // undefined
var x = 5;

Здесь на этапе компиляции происходит hoisting объявления var x, и переменная создаётся в глобальной области (или в области функции) со значением undefined. Затем выполняется console.log(x), который выводит undefined, и только потом выполняется присваивание x = 5.

Важно отличать это от let и const, которые также поднимаются, но находятся в "временной мёртвой зоне" (temporal dead zone) до момента инициализации. Обращение к ним до объявления вызывает ReferenceError.

На практике

На практике это поведение может приводить к неожиданным результатам, особенно в больших функциях или при использовании условных конструкций. Например, если вы обращаетесь к переменной до её объявления внутри функции, вы получите undefined, а не ошибку, что может скрыть логические ошибки.

Также важно помнить, что hoisting работает для каждой области видимости отдельно. Если переменная объявлена внутри функции, она будет поднята в начало этой функции, а не в глобальную область.

Пример кода

JAVASCRIPT
function example() {
console.log(a); // undefined
if (true) {
var a = 10;
}
console.log(a); // 10
}
example();

Здесь var a поднимается в начало функции example, поэтому первый console.log выводит undefined, а второй - 10, потому что присваивание уже выполнено.

Как отвечать на собеседовании

Начните с краткого определения hoisting, затем объясните разницу между var, let и const. Упомяните, что для var поднимается только объявление, а инициализация остаётся на месте. Приведите пример с undefined. Если интервьюер спросит про temporal dead zone, объясните, что для let и const обращение до объявления вызывает ошибку. Хорошо также упомянуть, что hoisting работает для функций целиком, а для переменных - только для объявлений.

Что проверяет интервьюер

Интервьюер проверяет понимание базовых механизмов JavaScript: hoisting, области видимости, разницу между типами объявлений переменных. Также оценивается способность объяснить поведение кода и предсказать результат выполнения. Это базовый вопрос для middle-уровня, поэтому ожидается уверенный ответ без запинок.

Типичные ошибки

  • Утверждение, что обращение до объявления вызывает ошибку - это неверно для var.
  • Смешение hoisting для var и let/const.
  • Непонимание, что hoisting работает в пределах области видимости, а не глобально.
  • Забывают, что присваивание не поднимается, только объявление.
  • Путаница между undefined и ReferenceError.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью