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

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

Компании: ЛитРес

Стек: JavaScript

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

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

var - устаревший способ объявления с функциональной областью видимости и всплытием без временной мёртвой зоны. let и const - современные, с блочной областью видимости и TDZ. const запрещает переприсваивание, но не мутацию объектов. Основное правило: используйте const по умолчанию, let - когда нужно переприсваивание, var - никогда в новом коде.

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

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

  • var - функциональная или глобальная. Переменная доступна внутри всей функции, даже если объявлена в блоке if или for.
  • let и const - блочная. Переменная существует только внутри блока {}, где объявлена.

Всплытие (hoisting):

  • var - объявление всплывает в начало функции, инициализация остаётся на месте. До строки объявления переменная существует со значением undefined.
  • let и const - тоже всплывают, но не инициализируются. До объявления доступ к ним вызывает ReferenceError - это временная мёртвая зона (TDZ).

Переприсваивание:

  • var и let - можно переприсваивать значения.
  • const - нельзя переприсваивать. Но если значение - объект или массив, его свойства и элементы можно изменять.

Повторное объявление:

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

Глобальный объект:

  • var на верхнем уровне создаёт свойство на window (в браузере) или global (в Node.js).
  • let и const - не создают свойств на глобальном объекте.

На практике

В реальном коде:

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

Типичные сценарии:

  • Цикл for с let создаёт новую привязку на каждой итерации - это решает классическую проблему с замыканиями.
  • const не защищает от мутаций - для неизменяемых структур используйте Object.freeze() или библиотеки типа Immutable.js.
  • В Node.js модули уже имеют свою область видимости, поэтому var на верхнем уровне модуля не попадает в global.

Пример кода

JAVASCRIPT
// Область видимости
function scopeExample() {
if (true) {
var varVariable = 'var';
let letVariable = 'let';
const constVariable = 'const';
}
console.log(varVariable); // 'var' - доступно
console.log(letVariable); // ReferenceError
console.log(constVariable); // ReferenceError
}
// Всплытие и TDZ
console.log(varHoisted); // undefined
// console.log(letHoisted); // ReferenceError
var varHoisted = 'value';
let letHoisted = 'value';
// const и мутации
const obj = { count: 1 };
obj.count = 2; // работает
// obj = { count: 3 }; // TypeError
// Цикл с let
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // 0, 1, 2
}
for (var j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 0); // 3, 3, 3
}

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

Начните с ключевого различия: область видимости и TDZ. Затем переходите к практическому правилу - const по умолчанию, let при необходимости переприсваивания. Упомяните проблему с замыканиями в цикле как мотивацию для блочной области видимости. Если спросят про var - скажите, что это legacy-механизм, который не нужен в современном коде. Хорошо показать понимание, что const не означает неизменяемость.

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

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

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

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

  • Утверждение, что const делает объекты неизменяемыми - это не так.
  • Забывают про TDZ и думают, что let и const не всплывают вообще.
  • Говорят, что var - это просто "старый let", не упоминая функциональную область видимости.
  • Путают повторное объявление и переприсваивание: let нельзя объявить дважды, но можно переприсвоить.
  • Не упоминают, что var на верхнем уровне создаёт свойство глобального объекта, а let и const - нет.

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

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