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

.
¿Fue útil?

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.

respuesta

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top