Что такое temporal dead zone (TDZ) в JavaScript
Что проверяют
Разбираетесь ли вы в том, как создаются области видимости, или пересказываете правило про то, что let нельзя использовать до объявления. Вопрос любят как быстрый тест на понимание подъёма.
Как отвечать
Объявления let, const и классов тоже поднимаются: привязка создаётся при входе в блок, но остаётся неинициализированной. Промежуток от входа в блок до выполнения строки объявления и есть временная мёртвая зона, обращение внутри неё даёт ошибку ссылки. Переменная через var в той же ситуации отдаёт undefined, потому что инициализируется сразу.
{
typeof x; // ошибка, хотя для необъявленного имени вернулось бы "undefined"
let x = 1;
}
const read = () => y; // функция объявлена раньше
let y = 2;
read(); // 2: к моменту вызова зона уже закончиласьЗона временная, а не текстовая: важен момент выполнения, а не то, выше или ниже написана функция. Под правило попадают ещё параметры по умолчанию, которые ссылаются на объявленные правее, и обращение к полю класса до его инициализации.
Полезно объяснить, зачем так сделано: явная ошибка лучше молчаливого undefined, а const без мёртвой зоны вообще не получился бы, ведь значение присваивается ровно один раз.
Где спотыкаются
Говорят, что let и const не поднимаются. Поднимаются: иначе обращение до объявления доставало бы значение из внешней области, а оно падает с ошибкой, потому что внутренняя привязка уже существует.
Проверяют переменную через typeof и ждут безопасного ответа. Для необъявленного имени он вернёт строку, а для имени в мёртвой зоне бросит исключение, и защитная проверка сама роняет код.
Считают зону свойством всей функции. Она ограничена своим блоком: объявление внутри условия или цикла не создаёт мёртвую зону за его пределами, и одноимённая внешняя переменная там прекрасно читается.