Глобальний об’єкт надає змінні та функції, доступні в будь-якому місці програми. За замовчуванням ті, які вбудовані в мову або середовище.
У браузері він має назву window
, у Node.js – global
, для інших середовищ він може мати іншу назву.
Нещодавно до мови було додано globalThis
як стандартизовану назву глобального об’єкта, який має підтримуватися у всіх середовищах. Він підтримується у всіх основних браузерах.
Ми будемо використовувати window
, вважаючи, що наше середовище – це браузер. Якщо ваш скрипт може працювати в інших середовищах, краще використовувати замість цього globalThis
.
До всіх властивостей глобального об’єкта можна отримати доступ напряму:
alert("Привіт");
// це те ж саме, що і
window.alert("Привіт");
У браузері глобальні функції і змінні оголошені за допомогою var
(не let/const
!) стають властивостями глобального об’єкта:
var gVar = 5;
alert(window.gVar); // 5 (змінна стала властивістю глобального об’єкта)
Такий же ефект мають оголошення функцій (оператори з ключовим словом 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
(його немає у дуже старих браузерах):
if (!window.Promise) {
alert("Твій браузер застарів!");
}
Якщо його немає (побачимо повідомлення: “Твій браузер застарів!”), ми можемо створити «поліфіли», щоб додати підтримку цього об’єкту. Додати функції, які не підтримуються середовищем, але існують у сучасному стандарті.
if (!window.Promise) {
window.Promise = ... // Не стандартна реалізація `Promise`
}
Підсумки
-
Глобальний об’єкт містить змінні, які мають бути доступними скрізь.
Включаючи вбудовані у JavaScript, такі як
Array
, та значення, характерні для середовища, такі якwindow.innerHeight
– висота вікна у браузері. -
Глобальний об’єкт має універсальну назву
globalThis
.… Але частіше згадуються специфічні назви середовища “старої школи”, такі як
window
(браузер) таglobal
(Node.js). -
Ми повинні зберігати значення у глобальному об’єкті, лише якщо вони дійсно глобальні для нашого проєкту. І тримати їх кількість мінімальною.
-
В браузерах, якщо ми не використовуємо модулі, глобальні функції та змінні, оголошені за допомогою
var
, стають властивістю глобального об’єкта. -
Для того, щоб код був простішим і в майбутньому його легше було підтримувати, слід звертатися до властивостей глобального об’єкта безпосередньо, через
window.x
.
Коментарі
<code>
, для кількох рядків – обгорніть їх тегом<pre>
, для понад 10 рядків – використовуйте пісочницю (plnkr, jsbin, codepen…)