Skip to main content

Спливання (hoisting)

Спливання (hoisting) - це механізм JavaScript, за якого оголошення змінних і функцій ніби «підіймаються» вгору своєї області видимості перед виконанням коду.

Простіше кажучи: JavaScript спочатку сканує весь код, реєструє оголошення, а потім починає виконувати команди порядково.


Приклад з var

javascript
console.log(a); // undefined var a = 10; console.log(a); // 10

Чому це так працює? Тому що під час компіляції рушій робить ось що:

javascript
var a; // оголошення спливло console.log(a); // undefined a = 10; // присвоєння console.log(a); // 10

Тобто оголошення (var a) спливає, але присвоєння (= 10) - ні.


Приклад з let і const

javascript
console.log(b); // ReferenceError let b = 20;

або

javascript
console.log(c); // ReferenceError const c = 30;

Хоча let і const теж спливають, вони потрапляють у тимчасову мертву зону (TDZ - Temporal Dead Zone), ділянку коду від початку області видимості до моменту фактичного оголошення. У цей час доступ до змінної заборонений.


Приклад із функціями

Function Declaration (спливає повністю):

javascript
sayHi(); // "Hi!" function sayHi() { console.log("Hi!"); }

Рушій «бачить» усе оголошення функції ще до виконання коду. Тому можна викликати її до рядка з визначенням.


Function Expression (НЕ спливає повністю):

javascript
sayHello(); // ReferenceError const sayHello = function() { console.log("Hello!"); };

Тут спливає лише оголошення змінної (const sayHello), але не присвоєння функції. Тому до моменту ініціалізації доступ заборонений (TDZ).


Підсумуємо

Що спливаєКоли доступнаПримітка
varОдразу, але значення undefinedМоже призводити до багів
let, constТільки після оголошенняДо цього: TDZ (ReferenceError)
function declarationЗавжди (повністю)Можна викликати до визначення
function expressionЯк змінна (let, const, var)Не доступна до ініціалізації

Аналогія

Уяви, що інтерпретатор спочатку будує план будівлі (оголошення), а потім починає його «заселяти» (присвоєння).

  • Оголошення функцій - як кімнати, вже готові до використання.
  • var - кімнати з табличкою, але порожні.
  • let і const - кімнати, які «закриті до відкриття».

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.