JavaScript - comprobar si en el contexto global
-
23-08-2019 - |
Pregunta
Cuando una función está unida a un objeto y llama:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
se refiere al objeto de que la función se llama como un método de. Es lo mismo que hacer f.call(o)
.
Cuando la función se llama no como parte de un objeto, this
se refiere al objeto global. ¿Cómo puedo comprobar si una función es llamada desde un contexto no-objeto? ¿Hay alguna palabra clave estándar para acceder al objeto global? Es la única manera de hacerlo algo como esto?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Nota: No tengo ningún caso de uso particular en mente aquí - De hecho, me pregunto acerca de este mecanismo exacto
.Solución
El objeto global es en realidad la ventana para que pueda hacer
if (this === window)
Otros consejos
La continuación debería funcionar ya que el uso Function.call con un valor nulo, se invocará en el ámbito global.
this === ((function () { return this; }).call(null))
Una variante más sencilla,
this === (function () { return this; })()
también va a funcionar, pero creo que la primera hace más clara la intención.
de RoBorg es conceptualmente correcto - excepto window
sólo está disponible en el contexto de los navegadores hilo principal (por lo que esto excluye necesariamente subprocesos de trabajo y similares, así como cualquiera que no sea el navegador alojado JS, que es cada vez menos infrecuente).
Su apuesta más segura es básicamente lo que tenía antes, pero debería utilizar var
y ===
ya que es posible que el intérprete para optimizar los accesos más completo.