← Назад к вопросам
Как работает Hoisting относительно const?
1.2 Junior🔥 222 комментариев
#JavaScript Core
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Hoisting и const в JavaScript
Hoisting - это поведение JavaScript, при котором объявления переменных и функций перемещаются в начало их области видимости. Однако const работает по-другому, чем var и let.
Что такое Hoisting
JavaScript обрабатывает код в два этапа: компиляция и выполнение. На этапе компиляции все объявления переменных и функций "поднимаются" (hoisted) в начало области видимости.
// Как вы пишете
console.log(x); // Что будет?
var x = 5;
// Как JavaScript интерпретирует
var x; // объявление hoisted
console.log(x); // undefined
x = 5; // присвоение остается на месте
Hoisting для var
Переменные var полностью hoisted с инициализацией undefined.
console.log(age); // undefined (не ошибка!)
var age = 25;
console.log(age); // 25
// Это то же самое что:
var age;
console.log(age); // undefined
age = 25;
console.log(age); // 25
Hoisting для let и const
let и const тоже hoisted, но они НЕ инициализируются. Это называется Temporal Dead Zone (TDZ).
console.log(name); // ReferenceError: Cannot access name before initialization
const name = "John";
// const hoisted но НЕ инициализирована
// От начала блока до строки объявления - Temporal Dead Zone
Temporal Dead Zone (TDZ)
Это период от начала блока до строки, где переменная объявлена.
{
console.log(value); // ReferenceError - в TDZ
const value = 10;
console.log(value); // 10 - теперь доступна
}
Различия между var, let, const
// var
console.log(varValue); // undefined - hoisted и инициализирован
var varValue = 1;
// let
console.log(letValue); // ReferenceError - в TDZ
let letValue = 2;
// const
console.log(constValue); // ReferenceError - в TDZ
const constValue = 3;
const и область видимости
const hoisted только в пределах своего блока (блочная область видимости).
function example() {
if (true) {
console.log(x); // ReferenceError - в TDZ блока if
const x = 5;
}
console.log(x); // ReferenceError - x не существует в функции
}
Hoisting функций
Функции полностью hoisted вместе с телом.
console.log(add(2, 3)); // 5 - функция полностью hoisted
function add(a, b) {
return a + b;
}
// Но function expression (стрелка) не hoisted
console.log(multiply(2, 3)); // TypeError: multiply is not a function
const multiply = (a, b) => a * b;
Практический пример TDZ
let x = 1;
function example() {
console.log(x); // ReferenceError (не выводит 1!)
let x = 2; // x hoisted в функции, но в TDZ
}
example();
Почему это важно
// Без понимания TDZ это может привести к ошибкам
const items = [1, 2, 3];
items.forEach((item) => {
console.log(item); // 1, 2, 3
const item = item * 2; // SyntaxError - нельзя переобъявить
});
Лучшие практики
- Используйте const по умолчанию
- Используйте let когда нужно переприсваивать
- Избегайте var в современном коде
- Всегда объявляйте переменные ДО их использования
- Понимайте TDZ для избежания ReferenceError
Понимание hoisting критично для написания безопасного и предсказуемого кода на JavaScript.