JavaScript - controllare se nel contesto globale
-
23-08-2019 - |
Domanda
Quando una funzione è collegato a un oggetto e chiama:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
riferisce all'oggetto che la funzione è stata richiamata come metodo di. E 'equivalente a fare f.call(o)
.
Quando la funzione viene richiamata non come parte di un oggetto, this
riferisce all'oggetto globale. Come posso controllare se una funzione viene chiamata da un contesto non-oggetto? C'è qualche parola chiave standard per accedere all'oggetto globale? È l'unico modo per farlo qualcosa di simile?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Nota: non ho alcun particolare caso d'uso in mente qui - Io in realtà sto chiedendo su questo meccanismo esatto
.Soluzione
L'oggetto globale è in realtà la finestra in modo da poter fare
if (this === window)
Altri suggerimenti
Il sotto dovrebbe funzionare dal usando Function.call con un valore nullo richiamerà nella portata globale.
this === ((function () { return this; }).call(null))
Una variante più semplice,
this === (function () { return this; })()
funziona anche, ma penso che il primo fa l'intenzione più chiara.
di RoBorg risposta è concettualmente corretto - ad eccezione window
è disponibile solo nel contesto del thread principale browser (quindi questo esclude necessariamente thread di lavoro e simili, così come qualsiasi non-navigatore ospitato JS, che sta diventando sempre meno non comune).
La cosa più sicura è fondamentalmente quello che si aveva in precedenza, ma si dovrebbe usare var
e ===
in quanto è possibile per l'interprete di ottimizzare tali accessi in modo più completo.