> Почему var всплывает и что происходит при всплытии в JavaScript (JavaScript)

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

Компании: Сбер

Стек: JavaScript

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

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

var всплывает (hoisting) из-за того, что на этапе компиляции JavaScript движок резервирует память под все объявления переменных и функций. При всплытии объявление var перемещается в начало своей области видимости, а инициализация остаётся на месте. До строки с присвоением переменная существует, но её значение - undefined.

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

Механизм hoisting - следствие двухфазной обработки кода в JavaScript: сначала компиляция, затем исполнение. На этапе компиляции движок сканирует код и находит все объявления с var, function и import. Для var создаётся запись в лексическом окружении со значением undefined. Само присвоение значения происходит позже, во время выполнения, когда поток доходит до соответствующей строки.

Важно: всплытие работает только для объявлений, а не для инициализаций. Например, var x = 5 разбивается на var x (всплывает) и x = 5 (остаётся на месте). В отличие от let и const, которые тоже всплывают, но находятся во временной мёртвой зоне (temporal dead zone) до момента инициализации, var сразу доступен со значением undefined.

Область видимости var - функция или глобальный контекст, а не блок. Это означает, что var внутри if или for будет доступен за пределами блока, что часто приводит к неожиданному поведению.

На практике

В современном JavaScript var практически вытеснен let и const. Основные проблемы с var на практике:

  • Случайное переопределение переменных в одной области видимости
  • Непредсказуемое поведение в циклах из-за отсутствия блочной области видимости
  • Загрязнение глобального объекта при объявлении вне функции

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

Для избежания проблем стоит использовать let и const по умолчанию, а var - только при необходимости поддержки очень старых браузеров или при работе с существующим кодом.

Пример кода

JAVASCRIPT
console.log(a); // undefined - всплытие, значение не присвоено
var a = 10;
console.log(a); // 10
// Эквивалентно:
var a;
console.log(a);
a = 10;
console.log(a);
// Проблема с блочной областью видимости
if (true) {
var b = 20;
}
console.log(b); // 20 - переменная "утекла" из блока
// Сравнение с let
if (true) {
let c = 30;
}
console.log(c); // ReferenceError: c is not defined

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

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

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

  • Понимание этапов выполнения JavaScript (компиляция vs исполнение)
  • Знание механизма лексического окружения и области видимости
  • Умение различать объявление и инициализацию
  • Осознание разницы между var, let, const и их практических последствий
  • Способность объяснить, почему var считается устаревшим

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

  • Утверждение, что let и const не всплывают - на самом деле они всплывают, но находятся в TDZ
  • Путаница между hoisting для var и для function declarations (функции всплывают целиком с телом)
  • Игнорирование области видимости функции для var - думают, что var ограничен блоком
  • Ошибочное мнение, что hoisting - это физическое перемещение кода в файле
  • Непонимание, что var в глобальной области создаёт свойство на window

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

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