Встречается на 26% собеседований по JavaScript

Чем let отличается от var

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

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

  • var: переменная, объявленная через var, доступна во всей функции, где она объявлена, независимо от вложенных блоков (например, if, for). Если объявить var вне функции, она становится глобальной переменной.
  • let: переменная, объявленная через let, доступна только внутри блока { ... }, где она объявлена. Блоком может быть тело цикла, условного оператора или просто фигурные скобки.

Пример:

javascript
if (true) {
  var varVariable = "Я доступен везде в функции";
  let letVariable = "Я доступен только в этом блоке";
}

console.log(varVariable); // Работает, потому что var имеет функциональную область видимости
console.log(letVariable); // Ошибка, потому что let имеет блочную область видимости

text

## Поднятие (Hoisting) и временная мертвая зона

- **`var`**: объявления переменных поднимаются в начало функции или скрипта. Это значит, что переменная существует до строки с её объявлением, но до инициализации её значение равно `undefined`.
- **`let`**: также поднимается, но не инициализируется. Доступ к переменной до её объявления вызывает `ReferenceError`. Этот период называется "временная мертвая зона" (Temporal Dead Zone, TDZ).

Пример:

```javascript
console.log(a); // undefined из-за поднятия
var a = 3;

console.log(b); // ReferenceError из-за временной мертвой зоны
let b = 4;

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

  • var: в глобальной области видимости переменные, объявленные через var, становятся свойствами глобального объекта (window в браузерах). Это может привести к конфликтам имён и нежелательному загрязнению глобального пространства.
  • let: в глобальной области видимости переменные, объявленные через let, не добавляются к глобальному объекту, что снижает риск конфликтов.

Когда использовать

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

Коротко

  • var имеет функциональную область видимости, let — блочную.
  • var поднимается с инициализацией undefined, let — без инициализации (TDZ).
  • В глобальном контексте var создаёт свойства глобального объекта, let — нет.
  • В современном коде предпочтительны let и const вместо var.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы