Todos estão cientes do this
javascript, mas também há casos de self
encontrados na natureza, como aqui
Então, qual é a diferença entre this
e self
em JavaScript?
javascript
Ben Nelson
fonte
fonte
window.self
(=== window
). Embora OP provavelmente signifique um nome de variável trivial ...this === self
é verdade :-)this
paraself
não é uma boa prática hoje em dia quando é comum ter código com muitos (bem, mais de um é ruim o suficiente) níveis de aninhamento de callback, como consequência da programação assíncrona. Use um nome mais descritivo.this
Falar objetivamente o nome em si não contém nenhuma informação e é apenas uma escolha de nome não ruim porque o contexto léxico de uma definição de classe o qualifica.Respostas:
A menos que definido em outro lugar, o valor de
self
éwindow
porque o JavaScript permite que você acesse qualquer propriedadex
dewindow
simplesmentex
, em vez dewindow.x
. Portanto,self
é realmentewindow.self
, o que é diferente dethis
.Se você estiver usando uma função que é executada no escopo global e não está no modo estrito, o
this
padrão éwindow
, e portantoSe você estiver usando uma função em um contexto diferente,
this
irá se referir a esse contexto, masself
ainda seráwindow
.Você pode encontrar
window.self
as definições no rascunho de trabalho do W3C 2006 para o objeto Janela aqui .fonte
self
é útil no contexto do WebWorker quando a janela não está acessível ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Usar emself
vez dewindow
permite acessar o objeto global de forma portátil.Uma ligeira adição a isso, pois as pessoas podem encontrar isso no contexto de trabalhadores de serviço, caso em que significa algo um pouco diferente.
Você pode ver isso em um módulo de service worker:
Aqui eu se refere ao WorkerGlobalScope e este é o método padrão para definir ouvintes de eventos.
Da documentação do Mozilla :
fonte
Embora eu esteja atrasado aqui, encontrei um exemplo que também pode ser útil para entender
this
melhor:O / P
fonte
A referência ao ECMA 5 precisa ser esclarecida.
Presumo que signifique ECMA-262 Edição 5. Deve-se observar que ECMA-262 (também conhecido como ECMAScript ou, menos precisamente, Javascript) é uma linguagem de script geral que foi implementada em navegadores da Internet. Do padrão da edição 5.1:
O termo "objeto global" se refere a qualquer objeto que esteja no topo da cadeia de escopo. Para navegadores, este seria o objeto "janela", mas é uma opção de implementação (o Windows Script Host tem um objeto global invisível, mas nenhum modo estrito, portanto, referências não qualificadas acessam suas propriedades e não há um "self" global). Além disso, o "modo estrito" deve ser ativado explicitamente, caso contrário, não estará ativo (seção 14.1 da norma). Como tal, um indefinido "this" ainda resolveria para o objeto global (janela) em "ECMA 5" com o modo estrito não ativo.
Portanto, a resposta à pergunta é:
"this" sempre se refere ao objeto que invoca a função. Se a função não foi chamada por um objeto (ou seja, não por uma chamada de método), então "this" (conforme passado para a função) é "indefinido". No entanto, se NÃO estiver usando o modo estrito, um "this" indefinido será definido para o objeto global (regra 2 acima).
"self" não tem nenhum significado sintático especial, é apenas um identificador. Os navegadores tendem a definir window.self (apenas uma propriedade do objeto global window) = window. Isso resulta em referências não qualificadas a "self" sendo o mesmo que "window" A MENOS que "self" tenha sido redefinido dentro de um escopo abrangente (como por "var self = this;" acima. Boa sorte ao redefinir "this".)
Portanto, a explicação completa do exemplo acima é:
Uma variação interessante do exemplo cria um fechamento, retornando uma referência à função interna.
Produzindo
Observe como a função interna não é chamada até que seja invocada por seuObjeto. Portanto, this.foo agora é seuObjeto.foo, mas self ainda é resolvido para a variável no escopo envolvente que, no momento em que o objeto de função interna foi retornado, era (e no fechamento resultante ainda é) meuObjeto. Portanto, dentro da função interna, "this" se refere ao objeto que chama a função interna, enquanto "self" se refere ao objeto que chamou a função externa para criar a referência à função interna.
Para resumir o resumo do resumo, "this" é definido pelo padrão de linguagem, "self" é definido por quem o define (implementador de tempo de execução ou programador final).
fonte
Encontre abaixo algumas combinações de saídas de console 'janela', 'self' e 'this' no escopo global (ambiente do navegador) para ver a que se refere.
fonte