21 березня 2025 р.

Глобальний об’єкт

Глобальний об’єкт надає нам змінні та функції, які доступні в будь-якому місці програми. Типово це ті, які вбудовані в мову або середовище.

У браузері він має назву window, у Node.js – global, для інших середовищ він може мати іншу назву.

Нещодавно до мови було додано globalThis як стандартизовану назву глобального об’єкта, який має підтримуватися у всіх середовищах. Він підтримується у всіх основних браузерах.

Ми будемо використовувати window, вважаючи, що наше середовище – це браузер. Якщо ваш скрипт може працювати в інших середовищах, краще використовувати замість цього globalThis.

До всіх властивостей глобального об’єкта можна отримати доступ напряму:

alert("Привіт");
// це те ж саме, що і
window.alert("Привіт");

У браузері глобальні функції і змінні оголошені за допомогою var (не let/const!) стають властивостями глобального об’єкта:

var gVar = 5;

alert(window.gVar); // 5 (змінна стала властивістю глобального об’єкта)

Так само стається з оголошеними функціями (function declaration). Тобто з використанням слова function в основному потоці коду, а не як в функціональних виразах.

Будь ласка, не покладайтесь на це! Така поведінка існує з міркувань сумісності. Сучасні скрипти використовують JavaScript модулі, де такого не відбувається

Якщо замість var ми використаємо let, такого не станеться:

let gLet = 5;

alert(window.gLet); // undefined (змінна не стає властивістю глобального об’єкта)

Якщо значення настільки важливе, що ви хочете зробити його глобальним, то напишіть його безпосередньо як властивість:

// робимо інформацію про користувача глобальною, щоб вона була доступною в будь-якому місці коду
window.currentUser = {
  name: "John"
};

// десь у коді
alert(currentUser.name);  // John

// або, якщо ми маємо локальну змінну з ім’ям "currentUser"
// отримаймо її з window безпосередньо (так безпечніше!)
alert(window.currentUser.name); // John

При цьому зазвичай не рекомендується використовувати глобальні змінні. Слід застосовувати їх якомога рідше. Дизайн коду, при якому функція отримує вхідні параметри і видає певний результат, чистіше, надійніше і зручніше для тестування, ніж коли використовуються зовнішні, а тим більш глобальні змінні.

Використання поліфілів

Ми використовуємо глобальний об’єкт для тестування підтримки сучасних мовних функцій браузером.

Наприклад, для перевірки чи існує вбудований об’єкт Promise