Какие переменные всплывают?
Основы языка
Всплывают (hoisting) объявления переменных `var` и функций (Function Declaration); `let`/`const` тоже «поднимаются», но попадают в temporal dead zone и недоступны до объявления.
Что всплывает и как
var — всплывает как undefined
Объявление поднимается, значение — нет:
console.log(x); // undefined
var x = 5;Function Declaration — всплывает целиком
Можно вызвать до объявления:
greet(); // работает
function greet() {}let / const — в TDZ
Поднимаются, но обращение до строки объявления кинет ReferenceError:
console.log(a); // ReferenceError (TDZ)
let a = 5;Function Expression / стрелка — не всплывают как функция
Всплывает только переменная (по правилам var/let):
fn(); // TypeError
var fn = function () {};Как это работает
В фазе компиляции движок регистрирует объявления в лексическом окружении. var инициализируется undefined, let/const — остаются неинициализированными (TDZ), функции-декларации — с телом.
Практический вывод
- Полагаться на hoisting не стоит.
let/constбезопаснее: TDZ ловит ранний доступ.
Коротко для собеседования
Всплывают var (как undefined) и Function Declaration (целиком, вызываемы до объявления). let/const поднимаются, но в TDZ — доступ до объявления даёт ReferenceError. Function Expression/стрелка всплывают только как переменная. Полагаться на hoisting не рекомендуется.