Проверяет понимание механизма hoisting для let и const и того, как Temporal Dead Zone влияет на доступ к переменным до их инициализации.
В JavaScript все объявления переменных в той или иной степени поднимаются (hoisting) в начало своей области видимости. Однако поведение var, let и const отличается. Переменные var инициализируются значением undefined сразу при входе в область видимости, поэтому к ним можно обратиться до объявления и получить undefined. Переменные let и const тоже создаются в области видимости на этапе компиляции, но остаются неинициализированными до момента выполнения строки с их объявлением. Этот промежуток называется Temporal Dead Zone (TDZ).
Если бы let и const не поднимались, обращение к ним до объявления давало бы ReferenceError с сообщением, что переменная не определена вообще. Но фактически движок знает о переменной и специально выбрасывает ошибку инициализации. Это видно по разным сообщениям об ошибке и по поведению typeof.
// var: hoisting с undefined
console.log(a); // undefined
var a = 1;
// let: TDZ
try {
console.log(b); // ReferenceError: Cannot access 'b' before initialization
} catch (e) {
console.log(e.name); // ReferenceError
}
let b = 2;
// typeof тоже бросает ошибку для let в TDZ
try {
console.log(typeof c); // ReferenceError
} catch (e) {
console.log(e.message);
}
let c = 3;
// А для необъявленной переменной typeof безопасен
console.log(typeof notDeclared); // "undefined"
На практике это означает, что код, который случайно обращается к let или const до объявления, падает с ошибкой, а не тихо возвращает undefined. Это улучшает надёжность и упрощает отладку.
Итог: let и const поднимаются, но находятся в TDZ до инициализации; используйте их вместо var, чтобы избежать неожиданного undefined и получать явные ошибки при неправильном порядке обращений.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию