Вопрос проверяет понимание поднятия объявлений (hoisting), областей видимости и причины TDZ для let/const.
Hoisting — это когда объявления “обрабатываются” до выполнения кода. У var объявление поднимается и переменная сразу инициализируется как undefined, поэтому к ней можно обратиться до строки объявления (получишь undefined). У let и const тоже есть поднятие объявления, но до фактической инициализации переменная находится в TDZ (temporal dead zone), и доступ к ней до объявления вызывает ReferenceError. const дополнительно требует инициализацию сразу при объявлении.
Hoisting — это поведение движка, при котором объявления (declaration) учитываются до выполнения кода. Важно: “поднимается” не значение, а факт объявления.
var: поднятие + инициализация undefinedvar имеет функциональную область видимости (function scope)
при входе в функцию переменная существует и равна undefined
Пример:
'use strict';
console.log(x); // undefined
var x = 10;
console.log(x); // 10
Это эквивалентно по смыслу:
'use strict';
var x; // объявление поднялось
console.log(x); // undefined
x = 10; // присваивание осталось на месте
console.log(x);
let и const: поднятие объявления + TDZlet/const имеют блочную область видимости (block scope)
переменная существует “в блоке”, но недоступна до строки объявления
попытка чтения до объявления → ReferenceError
Пример:
'use strict';
console.log(a); // ReferenceError
let a = 10;
const дополнительноconst нельзя объявить без значения
запрещено переназначение (но объект внутри может быть мутабельным)
Пример:
'use strict';
const n = 1;
// n = 2; // TypeError: Assignment to constant variable
var может “маскировать” ошибки, возвращая undefined там, где ожидалась переменная
let/const дают более безопасное поведение: ошибка видна сразу
в циклах и блоках let часто предотвращает баги со “всплывающими” значениями
var поднимается и инициализируется undefined, поэтому доступ “до объявления” возможен. let/const тоже поднимаются, но до инициализации находятся в TDZ, поэтому доступ до объявления приводит к ReferenceError — это делает код безопаснее.