Разница
| Необъявленная | Объявлена, но undefined |
|---|
| Пример | вообще нет let x | let x; |
| Чтение | ReferenceError | значение undefined |
typeof | "undefined" (без ошибки!) | "undefined" |
in globalThis (browser, var) | обычно нет | зависит от объявления |
typeof notExists;
console.log(notExists);
let declared;
console.log(declared);
typeof declared;
Присвоение без объявления
ImplicitGlobal = 1;
"use strict";
ImplicitGlobal = 1;
Зачем различать на собесе
Чтобы не путать «переменная есть, значения нет» и «имени нет в scope». Отладка: ReferenceError vs логическое ветвление по undefined.
Итог: необъявленная — нет binding (чтение падает, кроме typeof); undefined-переменная — binding есть, значение пустое.