Frage

Was ist der empfohlene Weg, um das Problem in den Griff zu bekommen globales Objekt im strikten ES5-Modus in einer unbekannten Hostumgebung?

ECMAScript bietet keine integrierte Möglichkeit, auf das mir bekannte globale Objekt zu verweisen.Wenn ja, ist dies die Antwort, nach der ich suche.

In einem bekannte Umgebung, hat das globale Objekt normalerweise eine selbstreferenzielle Eigenschaft.Da das globale Objekt das ist VO für den globalen Gültigkeitsbereich sind Eigenschaften des globalen Objekts globale Variablen, sodass wir sie verwenden können, um von überall aus ein Handle für das globale Objekt zu erhalten:

  • In einem Webbrowser können wir verwenden window oder self.

  • Im Knoten.js, wir können verwenden global.

Dies ist jedoch nicht unbedingt in allen Hostumgebungen der Fall.Soweit ich weiß, bietet Windows Script Host keine Möglichkeit, auf das globale Objekt zuzugreifen.Der empfohlene Weg, um das globale Objekt in WSH zu erhalten, scheint zu sein, das zu verwenden this schlüsselwort in einem Kontext, in dem es nicht in ein Objekt aufgelöst wird.Beispielsweise:

var GLOBAL = (function(){return this}());

Diese Technik funktioniert für jede Hostumgebung, jedoch nicht im strikten Modus, da eine undefinierte this verweist nicht auf das globale Objekt in strikter Modus:

Wenn dies im strikten Moduscode ausgewertet wird, wird dieser Wert nicht zu einem Objekt gezwungen. A Dieser Wert von null oder undefined wird nicht in das globale Objekt konvertiert und primitive Werte werden nicht in Wrapper-Objekte konvertiert.Der this Wert wird über einen Funktionsaufruf übergeben (einschließlich Aufrufe, die mit Function .Prototyp.anwenden und funktionieren.Prototyp.aufruf) erzwingen Sie den übergebenen Wert nicht an ein Objekt (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4).

Wie erwartet führt der folgende Code zu undefined:

(function(){
    "use strict";
    var GLOBAL = (function(){return this}());
    console.log(GLOBAL);
}());

Also, was ist der richtige Weg zu erhalten Sie ein Handle für das globale Objekt in jeder Umgebung, unabhängig vom strikten Modus?

Übrigens besteht mein aktueller Ansatz darin, nach globalen Variablen zu suchen, die auf das globale Objekt verweisen:

var self, window, global = global || window || self;

...und dann einfach benutzen global.Ich denke, dies ist aus einer Reihe von Gründen eine schlechte Lösung, von denen die meisten ziemlich offensichtlich sind, und es geht nicht um das WSH-Problem.

War es hilfreich?

Lösung

In ES5 können Sie einen Verweis auf ein globales Objekt im strikten Modus über einen indirekten eval Aufruf abrufen:

"use strict";
var global = (1,eval)('this');

Werfen Sie einen Blick auf mein Artikel;besonders bei diesem abschnitt über den strikten Modus.

Andere Tipps

In globaler Code, der thisBinding wird unabhängig vom strikten Modus auf das globale Objekt gesetzt.Das heißt, Sie können es von dort in Ihr Modul IEFE übergeben:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

Im strikten Modus können Sie einen Verweis auf das globale Objekt erhalten, indem Sie dem globalen Objekt eine Variable zuweisen, die auf sich selbst verweist.

Das ist this bedeutet das globale Objekt im globalen Kontext, also ist die Lösung einfach:

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

Dieser tun bedeutet, dass Sie den globalen Namespace mit einem Verweis auf sich selbst verschmutzen müssen, aber wie Sie sagen, er hätte schon da sein sollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top