globalThis

Глобальное свойство globalThis содержит значение глобального this, который является глобальным объектом.

Синтаксис

globalThis

Описание

Исторически, для доступа к глобальному объекту использовался разный синтаксис в разных средах JavaScript. В вебе вы могли использовать window, self или frames, но в Worker можно использовать только self. В Node.js ничего из этого не работает, поэтому вы должны использовать global.

Ключевое слово this можно использовать внутри функций в нестрогом режиме. Но в строгом режиме внутри функций и в Модулях this равняется undefined. Вы можете использовать Function('return this')(), но среды, которые отключают eval(), такие как CSP в браузерах, препятствуют использованию Function таким способом.

Свойство globalThis даёт возможность стандартного доступа к глобальному значению this (и как следствие, к глобальному объекту) вне зависимости от окружения. В отличии от похожих свойств, таких как window и self, оно гарантирует работу как в среде, где есть window, так и в среде, где его нет. Таким образом вы можете получить доступ к глобальному объекту даже не зная в какой среде будет запущен код. Чтобы помочь запомнить название, просто запомните, что глобальное значение this равно globalThis.

HTML и WindowProxy

Во многих движках globalThis будет ссылкой на фактический глобальный объект, но в веб-браузерах из-за соображений безопасности iframe и cross-window он ссылается на Proxy вокруг фактического глобального объекта (который вы не можете получить прямым доступом). Это различие редко актуально в обычном использовании, но его важно знать.

Название

Некоторые другие популярные имена, такие как self и global были исключены из рассмотрения из-за того, что они могут нарушать совместимость с существующим кодом. Смотрите документ по планированию именования для большей информации.

Примеры

До globalThis единственным кросс-платформенным путём получения глобального объекта в любой среде было Function('return this')(). Однако, это нарушает CSP в некоторых случаях. Например, es6-shim делает такую проверку:

var getGlobal = function () { 
  if (typeof self !== 'undefined') { return self; } 
  if (typeof window !== 'undefined') { return window; } 
  if (typeof global !== 'undefined') { return global; } 
  throw new Error('unable to locate global object'); 
}; 

var globals = getGlobal(); 

if (typeof globals.setTimeout !== 'function') { 
  // в данном окружении не существует setTimeout! 
}

С globalThis дополнительный поиск глобального объекта в разных средах больше не нужен:

if (typeof globalThis.setTimeout !== 'function') { 
// в данном окружении не существует setTimeout! 
}

Спецификации

Specification
ECMAScript (ECMA-262)
Определение 'globalThis' в этой спецификации.

Совместимость с браузерами

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
globalThisChrome Полная поддержка 71Edge Полная поддержка 79Firefox Полная поддержка 65IE Нет поддержки НетOpera Полная поддержка 58Safari Полная поддержка 12.1WebView Android Полная поддержка 71Chrome Android Полная поддержка 71Firefox Android Полная поддержка 65Opera Android Полная поддержка 50Safari iOS Полная поддержка 12.2Samsung Internet Android Полная поддержка 10.0nodejs Полная поддержка 12.0.0

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

Прогресс реализации

В следующей таблице приведено ежедневное состояние реализации этой функции, поскольку эта функция еще не достигла стабильности в разных браузерах. Данные генерируются путем запуска соответствующих тестов функциональности в Test262, стандартном наборе тестов JavaScript, в ночной сборке или в последней версии движка JavaScript каждого браузера.