globalThis

Die globalThis globale Eigenschaft enthält den globalen this Wert, der in der Regel dem globalen Objekt ähnelt.

Probieren Sie es aus

Wert

Das globale this-Objekt.

Eigenschaften der globalThis-Property
Schreibbar ja
Aufzählbar nein
Konfigurierbar ja

Hinweis: Die globalThis-Eigenschaft ist konfigurierbar und beschreibbar, sodass Codeautoren sie verstecken können, wenn nicht vertrauenswürdiger Code ausgeführt wird, um zu verhindern, dass das globale Objekt überbelichtet wird.

Beschreibung

Historisch gesehen erforderte der Zugriff auf das globale Objekt unterschiedliche Syntax in verschiedenen JavaScript-Umgebungen. Im Web können Sie window, self oder frames verwenden - aber in Web Workers funktioniert nur self. In Node.js funktioniert keiner dieser Zugriffe, stattdessen muss global verwendet werden. Das this-Schlüsselwort konnte innerhalb von Funktionen, die im nicht-strikten Modus laufen, verwendet werden, aber this ist undefined in Modulen und innerhalb von Funktionen, die im strikten Modus laufen. Sie können auch Function('return this')() verwenden, aber Umgebungen, die eval() deaktivieren, wie CSP in Browsern, verhindern die Verwendung von Function auf diese Weise.

Die globalThis-Eigenschaft bietet eine standardisierte Möglichkeit, auf den globalen this-Wert (und damit auf das globale Objekt selbst) in verschiedenen Umgebungen zuzugreifen. Im Gegensatz zu ähnlichen Eigenschaften wie window und self funktioniert es garantiert in Fenster- und Nicht-Fenster-Kontexten. Auf diese Weise können Sie auf das globale Objekt konsistent zugreifen, ohne wissen zu müssen, in welcher Umgebung der Code ausgeführt wird. Um Ihnen den Namen zu merken, denken Sie einfach daran, dass im globalen Gültigkeitsbereich der this-Wert globalThis ist.

Hinweis: globalThis ist im Allgemeinen dasselbe Konzept wie das globale Objekt (d.h. das Hinzufügen von Eigenschaften zu globalThis macht sie zu globalen Variablen) – dies ist der Fall für Browser und Node – aber Hosts dürfen einen anderen Wert für globalThis bereitstellen, der nichts mit dem globalen Objekt zu tun hat.

HTML und der WindowProxy

In vielen Engines wird globalThis eine Referenz auf das tatsächliche globale Objekt sein, aber in Webbrowsern, aufgrund von Sicherheitsüberlegungen bei iframes und fensterübergreifenden Verbindungen, verweist es auf einen Proxy um das tatsächliche globale Objekt (auf das Sie nicht direkt zugreifen können). Dieser Unterschied ist in der gewöhnlichen Nutzung selten von Bedeutung, aber wichtig zu beachten.

Namensgebung

Mehrere andere beliebte Namensvorschläge wie self und global wurden aus der Überlegung herausgenommen, weil sie die Kompatibilität mit bestehendem Code gefährden könnten. Siehe das Dokument zur Namensgebung des Sprachvorschlags für weitere Details.

globalThis ist buchstäblich der globale this-Wert. Es ist derselbe Wert wie der this-Wert in einer nicht-strikten Funktion, die ohne ein Objekt aufgerufen wird. Es ist auch der Wert von this im globalen Gültigkeitsbereich eines Skripts.

Beispiele

Suchen nach dem Globalen in verschiedenen Umgebungen

Normalerweise muss das globale Objekt nicht explizit angegeben werden – seine Eigenschaften sind automatisch als globale Variablen zugänglich.

js
console.log(window.Math === Math); // true

Ein Fall, in dem das globale Objekt jedoch explizit angesprochen werden muss, ist, wenn darauf geschrieben werden soll, üblicherweise für Polyfills.

Vor globalThis war der einzige zuverlässige plattformübergreifende Weg, um das globale Objekt für eine Umgebung zu erhalten, Function('return this')(). Dies verursacht jedoch CSP-Verletzungen in einigen Einstellungen, daher würden Autoren eine Stückweise-Definition wie diese verwenden (leicht angepasst von der originalen core-js-Quelle):

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")();

Nachdem das globale Objekt erhalten wurde, können wir neue globale Variablen darauf definieren. Zum Beispiel das Hinzufügen einer Implementierung für Intl:

js
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,
  });
}

Mit globalThis verfügbar, ist die zusätzliche Suche nach dem Globalen in verschiedenen Umgebungen nicht mehr notwendig:

js
if (typeof globalThis.Intl === "undefined") {
  Object.defineProperty(globalThis, "Intl", {
    value: {
      // Our Intl implementation
    },
    enumerable: false,
    configurable: true,
    writable: true,
  });
}

Spezifikationen

Specification
ECMAScript Language Specification
# sec-globalthis

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch