Spec-Zone.ru › JavaScript

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

См. также

  • Полифилл globalThis в core-js
  • Полифилл globalThis от es-shims
  • this

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API