Глобальный объект предоставляет переменные и функции, доступные где угодно. По умолчанию это те, которые встроены в язык или среду.
В браузере оно называется window
, для Node.js — global
, для других сред может иметь другое имя.
Недавно в язык было добавлено globalThis
как стандартизированное имя глобального объекта, которое должно поддерживаться во всех средах. Он поддерживается во всех основных браузерах.
Здесь мы будем использовать window
, предполагая, что нашей средой является браузер. Если ваш скрипт может работать в других средах, лучше использовать вместо него globalThis
.
Ко всем свойствам глобального объекта можно получить прямой доступ:
Оповещение("Привет"); // то же самое, что и window.alert("Привет");
В браузере глобальные функции и переменные, объявленные с помощью var
(не let/const
!), становятся свойством глобального объекта:
вар гВар = 5; оповещение(window.gVar); // 5 (стало свойством глобального объекта)
Объявления функций имеют тот же эффект (операторы с ключевым словом function
в основном потоке кода, а не выражения функций).
Пожалуйста, не полагайтесь на это! Такое поведение существует по соображениям совместимости. Современные скрипты используют модули JavaScript там, где такого не происходит.
Если бы вместо этого мы использовали let
, такого бы не произошло:
пусть gLet = 5; оповещение(window.gLet); // неопределенно (не становится свойством глобального объекта)
Если значение настолько важно, что вы хотели бы сделать его доступным глобально, запишите его непосредственно как свойство:
// делаем текущую информацию о пользователе глобальной, чтобы все скрипты могли получить к ней доступ window.currentUser = { имя: «Джон» }; // где-то еще в коде оповещение(текущийПользователь.имя); // Джон // или, если у нас есть локальная переменная с именем "currentUser" // получить его из окна явно (безопасно!) оповещение(window.currentUser.name); // Джон
Тем не менее, использование глобальных переменных обычно не рекомендуется. Глобальных переменных должно быть как можно меньше. Дизайн кода, в котором функция получает «входные» переменные и выдает определенный «результат», более понятен, менее подвержен ошибкам и легче тестируется, чем если бы он использовал внешние или глобальные переменные.
Мы используем глобальный объект для проверки поддержки современных функций языка.
Например, проверьте, существует ли встроенный объект Promise
(в старых браузерах его нет):
если (!window.Promise) { alert("Ваш браузер очень старый!"); }
Если такового нет (скажем, мы в старом браузере), мы можем создать «полифиллы»: добавить функции, которые не поддерживаются средой, но существуют в современном стандарте.
если (!window.Promise) { window.Promise = ... // пользовательская реализация функции современного языка }
Глобальный объект содержит переменные, которые должны быть доступны повсюду.
Сюда входят встроенные функции JavaScript, такие как Array
, и значения, зависящие от среды, такие как window.innerHeight
— высота окна в браузере.
Глобальный объект имеет универсальное имя globalThis
.
…Но чаще всего его называют «старыми» именами, специфичными для среды, такими как window
(браузер) и global
(Node.js).
Нам следует хранить значения в глобальном объекте только в том случае, если они действительно глобальны для нашего проекта. И свести их количество к минимуму.
В браузере, если мы не используем модули, глобальные функции и переменные, объявленные с помощью var
становятся свойством глобального объекта.
Чтобы сделать наш код перспективным и простым для понимания, мы должны напрямую обращаться к свойствам глобального объекта, как window.x
.