globalThis
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с января 2020 года.
Глобальное свойство globalThis содержит значение глобального this, которое обычно сродни глобальному объекту.
Попробуйте
function canMakeHTTPRequest() {
return typeof globalThis.XMLHttpRequest === "function";
}
console.log(canMakeHTTPRequest());
// Expected output (in a browser): true
Значение
Глобальный объект this.
Атрибуты свойства globalThis
| |
|---|---|
| Записываемое | да |
| Перечислимое | нет |
| Конфигурируемое | да |
Примечание: Свойство globalThis является конфигурируемым и записываемым, чтобы авторы кода могли скрыть его при выполнении недоверенного кода и предотвратить раскрытие глобального объекта.
Описание
Исторически сложилось так, что доступ к глобальному объекту требовал разного синтаксиса в разных средах JavaScript. В вебе вы можете использовать window, self или frames — но в Web Workers будет работать только self. В Node.js ни один из этих вариантов не работает, и вместо этого необходимо использовать global. Ключевое слово this можно было использовать внутри функций, работающих в нестрогом режиме, но this будет undefined в модулях и внутри функций, работающих в строгом режиме. Вы также можете использовать Function('return this')(), но среды, которые отключают eval(), такие как CSP в браузерах, предотвращают использование Function таким образом.
Свойство globalThis предоставляет стандартный способ доступа к значению глобального this (и, следовательно, к самому глобальному объекту) в различных средах. В отличие от аналогичных свойств, таких как window и self, оно гарантированно работает в оконных и не оконных контекстах. Таким образом, вы можете получить доступ к глобальному объекту согласованным образом, не зная, в какой среде выполняется код. Чтобы помочь вам запомнить имя, просто помните, что в глобальной области видимости значение this — это globalThis.
Примечание: globalThis в целом представляет собой ту же концепцию, что и глобальный объект (то есть добавление свойств к globalThis делает их глобальными переменными) — это справедливо для браузеров и Node — но хостам разрешено предоставлять другое значение для globalThis, не связанное с глобальным объектом.
HTML и WindowProxy
Во многих движках globalThis будет ссылкой на фактический глобальный объект, но в веб-браузерах, из-за соображений безопасности iframe и перекрёстного окна, он ссылается на Proxy вокруг фактического глобального объекта (к которому вы не можете получить прямой доступ). Это различие редко актуально при обычном использовании, но важно о нём знать.
Именование
Некоторые другие популярные варианты названий, такие как self и global, были исключены из рассмотрения из-за их потенциала нарушить совместимость с существующим кодом. Смотрите документ «naming» языкового предложения для получения более подробной информации.
globalThis — это, буквально, глобальное значение this. Это то же самое значение, что и значение this в нестрогой функции, вызванной без объекта. Это также значение this в глобальной области видимости скрипта.
Примеры
Поиск глобального объекта в различных средах
Обычно глобальный объект не нужно указывать явно — его свойства автоматически доступны как глобальные переменные.
console.log(window.Math === Math); // true
Однако случай, когда необходимо явно получить доступ к глобальному объекту, — это запись в него, обычно для целей полифиллов.
До globalThis единственным надёжным кроссплатформенным способом получить глобальный объект для среды был Function('return this')(). Однако это вызывает нарушения CSP в некоторых настройках, поэтому авторы использовали такое пошаговое определение (немного адаптированное из исходного кода core-js):
function check(it) {
// Math is known to exist as a global in every environment.
return it && it.Math === Math && it;
}
const globalObject =
check(typeof window === "object" && window) ||
check(typeof self === "object" && self) ||
check(typeof global === "object" && global) ||
// This returns undefined when running in strict mode
(function () {
return this;
})() ||
Function("return this")();
Получив глобальный объект, мы можем определить на нём новые глобальные переменные. Например, добавив реализацию для Intl:
if (typeof globalObject.Intl === "undefined") {
// No Intl in this environment; define our own on the global scope
Object.defineProperty(globalObject, "Intl", {
value: {
// Our Intl implementation
},
enumerable: false,
configurable: true,
writable: true,
});
}
Когда globalThis доступен, дополнительный поиск глобального объекта в различных средах больше не требуется:
if (typeof globalThis.Intl === "undefined") {
Object.defineProperty(globalThis, "Intl", {
value: {
// Our Intl implementation
},
enumerable: false,
configurable: true,
writable: true,
});
}
Спецификации
| Спецификация |
|---|
| Спецификация языка ECMAScript® 2027 # sec-globalthis |
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
globalThis |
71 |
79 |
65 |
58 |
12.1 |
71 |
65 |
50 |
12.2 |
10.0 |
71 |
12.2 |
1.0.0 |
1.0 |
12.0.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis