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?

zu tun
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

.
War es hilfreich?

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.

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