JavaScript - überprüfen, ob in der globalen Kontext
-
23-08-2019 - |
Frage
Wenn eine Funktion an einem Objekt angebracht ist, und rief:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
bezieht sich auf das Objekt, das die Funktion als eine Methode der aufgerufen wurde. Es ist äquivalent zu f.call(o)
tun.
Wenn die Funktion nicht als Teil eines Objekts aufgerufen wird, bezieht sich this
auf das globale Objekt. Wie kann ich überprüfen, ob eine Funktion von einem Nicht-Objekt-Kontext aufgerufen wird? Gibt es ein Standard-Schlüsselwort das globale Objekt zugreifen? Ist der einzige Weg, um es so etwas wie das?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Hinweis: Ich habe keinen besonderen Anwendungsfall im Auge hier - ich eigentlich über diesen genauen Mechanismus bin zu fragen
.Lösung
Das globale Objekt ist eigentlich das Fenster, so können Sie tun,
if (this === window)
Andere Tipps
Die unten sollte Function.call da mit arbeiten mit einem Wert von null es im globalen Bereich aufrufen wird.
this === ((function () { return this; }).call(null))
Eine einfachere Variante,
this === (function () { return this; })()
wird auch funktionieren, aber ich denke, das erste macht die Absicht klarer.
RoBorg Antwort der ist vom Konzept her richtig - außer window
im Zusammenhang mit dem Browser Haupt-Thread nur verfügbar ist (so dies notwendigerweise Worker-Threads und dergleichen, sowie alle nicht-Browser JS ausschließt gehostet, die immer weniger und weniger gelegentlich).
Ihre sicherste Wette ist im Grunde, was Sie oben hatte, aber Sie sollten var
und ===
zu verwenden, da es möglich ist, für die Dolmetscher solche Zugriffe mehr vollständig zu optimieren.