Hack Frontend Community

Поднятие (Hoisting) в JavaScript

Важно:

В JavaScript объявления переменных и функций поднимаются в начало их области видимости, но инициализации остаются на своих местах. Это может приводить к неожиданному поведению, если не учитывать механизм hoisting.

Что такое hoisting?

Hoisting — это механизм, при котором объявления переменных и функций интерпретируются как находящиеся в начале своей области видимости (функции или глобальной области), независимо от того, где они физически записаны в коде. При этом только объявления поднимаются, а инициализации остаются на месте.


Как это работает?

Функциональные объявления

Функции, объявленные через конструкцию function, полностью поднимаются, что позволяет вызывать их до места фактического объявления в коде.

sayHello(); // "Hello from function declaration!"

function sayHello() {
  console.log("Hello from function declaration!");
}

Переменные с var

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

console.log(a); // undefined, потому что объявление var a поднимается, но инициализация остаётся на месте
var a = 10;
console.log(a); // 10

Переменные с let и const

Переменные, объявленные с помощью let и const, также поднимаются, но не инициализируются. Они находятся в так называемой временной мёртвой зоне (TDZ) до момента выполнения строки с инициализацией. Обращение к ним до инициализации вызывает ошибку ReferenceError.

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

// console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 30;

Основные моменты

  • Hoisting поднимает только объявления, а не значения.

  • Функциональные объявления полностью доступны до их фактического определения.

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

  • Переменные, объявленные с let и const, находятся в TDZ, что предотвращает их использование до инициализации.

Рекомендации

  • Используйте let и const вместо var: Они обеспечивают блочную область видимости и предотвращают ряд ошибок, связанных с hoisting.

  • Объявляйте переменные в начале блока или функции: Это повышает читаемость кода и снижает вероятность ошибок.

  • Будьте внимательны с порядком кода: Помните, что вызов функции, объявленной через function, возможен до её определения, а переменные, объявленные с let и const, не могут быть использованы до инициализации.

Итог:

Hoisting — это фундаментальный механизм JavaScript, который влияет на порядок доступа к переменным и функциям. Понимание hoisting помогает писать более надежный и предсказуемый код.