← Назад к вопросам

Что такое всплытие переменных?

2.0 Middle🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое всплытие переменных (Hoisting) в JavaScript

Всплытие переменных (Hoisting) — это механизм в JavaScript, при котором объявления переменных (с помощью var, let, const), функций (function declarations) и классов "поднимаются" вверх области их видимости перед выполнением кода. Однако важно понимать, что объявления всплывают, но инициализации — нет. Это означает, что движок JS как бы "перемещает" объявления в начало скрипта или функции на этапе компиляции, хотя физически код остаётся на прежнем месте.

Как работает всплытие для разных типов объявлений

1. Всплытие переменных var

Переменные, объявленные через var, всплывают со значением undefined до момента инициализации.

console.log(myVar); // undefined, а не ReferenceError
var myVar = 42;
console.log(myVar); // 42

Фактически код интерпретируется так:

var myVar; // Объявление всплыло
console.log(myVar); // undefined
myVar = 42; // Инициализация осталась на месте
console.log(myVar); // 42

2. Всплытие переменных let и const

Переменные let и const также всплывают, но не инициализируются до выполнения строки объявления. Доступ к ним до объявления вызывает ReferenceError.

console.log(myLet); // ReferenceError: Cannot access 'myLet' before initialization
let myLet = 10;

Это связано с концепцией временной мёртвой зоны (Temporal Dead Zone, TDZ) — периода от начала области видимости до момента объявления, где переменная недоступна.

3. Всплытие объявлений функций (Function Declaration)

Объявления функций всплывают полностью, включая их тело, что позволяет вызывать функцию до её объявления.

console.log(sayHello()); // "Привет!"

function sayHello() {
  return "Привет!";
}

4. Функциональные выражения (Function Expression) и стрелочные функции

Они всплывают как переменные, поскольку присваиваются переменной (var, let, const).

console.log(funcExpression); // undefined (если var) или ReferenceError (если let/const)
console.log(funcExpression()); // Ошибка: funcExpression не функция

var funcExpression = function() {
  return "Выражение";
};

Почему всплытие важно понимать

  • Избежание ошибок: Непонимание всплытия может привести к неожиданному поведению, например, использованию undefined вместо ожидаемого значения.
  • Читаемость кода: Хотя технически можно вызывать функции до объявления, для ясности кода рекомендуется объявлять переменные и функции в начале их области видимости.
  • Отличия var, let, const: Понимание всплытия помогает осознать, почему let/const более безопасны, чем var, из-за TDZ.

Практический пример с var и замыканием

var funcs = [];
for (var i = 0; i < 3; i++) {
  funcs.push(function() {
    console.log(i); // Все функции выводят 3, так как i всплыла и одна на весь цикл
  });
}
funcs[0](); // 3
funcs[1](); // 3
funcs[2](); // 3

Решение с let (блочная область видимости):

let funcs = [];
for (let i = 0; i < 3; i++) {
  funcs.push(function() {
    console.log(i); // 0, 1, 2 — для каждой итерации своя i
  });
}
funcs[0](); // 0
funcs[1](); // 1
funcs[2](); // 2

Вывод: Всплытие — это особенность компиляционной фазы JavaScript, а не буквальное перемещение кода. Для написания надёжного кода используйте let/const, объявляйте переменные в начале области видимости и учитывайте различия между типами объявлений. Это поможет избежать типичных ошибок, связанных с областью видимости и временной мёртвой зоной.

Что такое всплытие переменных? | PrepBro