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

.
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top