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