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

.
Foi útil?

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.

resposta

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top