Чем var отличается от let и const?
- Что такое hoisting и временная мёртвая зона?
var — область видимости функции, поднимается (hoisting) со значением undefined, допускает повторное объявление. let и const — область видимости блока {}, до строки объявления — временная мёртвая зона (ReferenceError). const запрещает переприсваивание, но не изменение объекта.
- В современном коде: const по умолчанию, let — если переменная меняется, var — не использовать
- var в цикле с колбэками — одно значение на все итерации; let создаёт новую переменную на итерацию
- Объявления функций поднимаются целиком
А ещё Object.freeze — неизменяемость объекта (поверхностная)
Подробно
console.log(a); // undefined — var поднят
var a = 1;
console.log(b); // ReferenceError — временная мёртвая зона
let b = 2;
const user = { name: "Аня" };
user.name = "Оля"; // можно: меняем объект
user = {}; // TypeError: переприсваивание
Hoisting. Перед выполнением движок регистрирует объявления области. var сразу инициализируется undefined, let/const — регистрируются, но недоступны до своей строки.
Блочная область:
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i)); // 3 3 3
for (let j = 0; j < 3; j++) setTimeout(() => console.log(j)); // 0 1 2
var на верхнем уровне скрипта становится свойством window, let и const — нет.
Что хотят услышать
- Область видимости: функция против блока.
- Hoisting и временная мёртвая зона.
- Что запрещает const.
- Ловушка var в цикле.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗const запрещает изменять содержимое объекта, а не только переприсваивание
- ✓var — область функции и hoisting; let и const — блок и TDZ; const запрещает переприсваивание
- ✗let имеет область видимости функции, а var — блочную
- ✗var не поднимается, поэтому обращение до объявления даёт ReferenceError
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.