JavaScript - Verifique se no contexto global
-
23-08-2019 - |
Pergunta
Quando uma função é anexado a um objeto e chamou:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
refere-se ao objecto que a função foi chamado como um método de. É equivalente a fazer f.call(o)
.
Quando a função é chamado não como parte de um objeto, this
se refere ao objeto global. Como posso verificar se a função está sendo chamado de um contexto não-objeto? Existe alguma palavra-chave padrão para acessar o objeto global? É a única maneira de fazê-lo algo assim?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Nota: Não tenho nenhum caso de uso específico em mente aqui - Na verdade, eu estou perguntando sobre este mecanismo exato
.Solução
O objeto global é realmente a janela para que você pode fazer
if (this === window)
Outras dicas
A seguir deve funcionar uma vez usando Function.call com um valor de null vai chamá-lo no âmbito global.
this === ((function () { return this; }).call(null))
A variante mais simples,
this === (function () { return this; })()
também funcionará, mas acho que as primeiras marcas a intenção mais clara.
O RoBorg é conceitualmente correto - exceto window
está disponível apenas no contexto da navegadores thread principal (de modo que isso necessariamente exclui segmentos de trabalho e similares, bem como qualquer não-navegador hospedado JS, que está ficando cada vez menos incomum).
A sua aposta mais segura é basicamente o que você tinha anteriormente, mas você deve usar var
e ===
como é possível que o intérprete para otimizar tais acessos mais completa.