> В чем разница между var, const и let в JavaScript (JavaScript)

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

Компании: Иннотех, YADRO, циан, ООО Премиум ИТ Солюшен, EvApps, РСХБ, Домклик, IT-One, Rutube, Сфера, Сбер, TYMY, 1221 Systems, Globaldrive, Evercode, Purrweb

Стек: JavaScript

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

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

var имеет функциональную область видимости и всплытие (hoisting) с инициализацией undefined, допускает повторное объявление. let и const имеют блочную область видимости, всплывают без инициализации (Temporal Dead Zone). const запрещает переприсваивание, но не иммутабельность объекта. let позволяет переприсваивать значение. Разница критична для предсказуемости кода и избежания багов в замыканиях.

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

Основные различия между var, let и const в JavaScript касаются области видимости, всплытия (hoisting), возможности повторного объявления и переприсваивания.

  • Область видимости: var ограничен функцией (function scope), а let и const - блоком (block scope), то есть фигурными скобками {}. Это означает, что переменная, объявленная через var внутри цикла или условия, будет доступна за его пределами, что часто приводит к неожиданному поведению.

  • Всплытие (hoisting): Все три типа объявлений поднимаются в начало своей области видимости. Однако var инициализируется значением undefined, поэтому к нему можно обратиться до строки объявления. let и const находятся во временной мертвой зоне (Temporal Dead Zone, TDZ) от начала блока до момента объявления - обращение к ним до строки объявления вызывает ReferenceError.

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

  • Переприсваивание: var и let позволяют изменять значение переменной после объявления. const запрещает переприсваивание - после инициализации переменная всегда ссылается на тот же объект или примитив. Однако для объектов и массивов это не означает иммутабельность: можно изменять их свойства или элементы.

  • Глобальный объект: При объявлении var на глобальном уровне создается свойство глобального объекта (например, window в браузере). let и const на глобальном уровне не создают свойств глобального объекта.

Для senior-разработчика важно понимать, что выбор между let и const - это не просто синтаксическое предпочтение, а инструмент для выражения намерений: const сигнализирует, что ссылка не будет переназначена, что упрощает чтение и рефакторинг кода. Использование var в современном коде обычно считается антипаттерном, за исключением legacy-кода или специфических случаев, когда нужно эмулировать функциональную область видимости.

На практике

В современном JavaScript (ES6+) стандартом де-факто является использование const по умолчанию для всех переменных, которые не требуют переприсваивания. let используется только когда значение переменной должно меняться (например, счетчик цикла, аккумулятор). var не используется в новом коде - его применение ограничено поддержкой очень старых браузеров или работой с legacy-кодом.

На практике это означает:

  • Все const, пока не понадобится переприсвоить.
  • let для переменных в циклах for (особенно с замыканиями, где var создает классическую проблему).
  • Никогда не использовать var в новом коде, если нет веской причины (например, нужно, чтобы переменная была свойством window).

Для senior-разработчика важно также учитывать, что const не делает объект иммутабельным - для полной неизменяемости нужно использовать Object.freeze() (поверхностно) или библиотеки вроде Immer.

Пример кода

JAVASCRIPT
// Область видимости
function example() {
if (true) {
var a = 1; // function scope
let b = 2; // block scope
const c = 3; // block scope
}
console.log(a); // 1 - доступно
console.log(b); // ReferenceError
console.log(c); // ReferenceError
}
// Всплытие и TDZ
console.log(x); // undefined (var)
var x = 10;
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 20;
// Повторное объявление
var z = 1;
var z = 2; // работает, z = 2
let w = 1;
let w = 2; // SyntaxError
// Переприсваивание
const obj = { key: 'value' };
obj.key = 'newValue'; // работает
obj = {}; // TypeError: Assignment to constant variable
// Проблема var в цикле с замыканием
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 3, 3, 3
}
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 100); // 0, 1, 2
}

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

Начни с ключевых различий: область видимости, всплытие, TDZ, повторное объявление и переприсваивание. Приведи конкретный пример с циклом и замыканием, чтобы показать практическую разницу между var и let. Упомяни, что const - это про ссылку, а не про значение, и что const не делает объект неизменяемым. Объясни, почему var считается устаревшим в современном коде, но не отрицай его существование в legacy-проектах. Для senior-уровня добавь рассуждение о том, как выбор объявления влияет на читаемость и поддерживаемость кода, и упомяни Temporal Dead Zone как механизм, предотвращающий ошибки доступа до инициализации.

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

Интервьюер проверяет:

  • Понимание фундаментальных концепций: scope, hoisting, TDZ.
  • Умение объяснить практические последствия выбора объявления.
  • Знание типичных проблем (например, var в циклах) и способов их решения.
  • Способность рассуждать о дизайне языка и best practices.
  • Для senior - глубину понимания: почему TDZ была введена, как const влияет на семантику кода, когда var может быть оправдан.

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

  • Утверждение, что const делает значение неизменяемым (путают с иммутабельностью).
  • Игнорирование Temporal Dead Zone и утверждение, что let/const не всплывают.
  • Использование var в современном коде без осознания последствий.
  • Непонимание, что let в цикле создает новую привязку на каждой итерации.
  • Путаница между областью видимости функции и блока (например, думают, что var ограничен блоком if).

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

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