Eu vi o seguinte na fonte para WebKit HTML 5 SQL Storage Notes Demo :
function Note() {
var self = this;
var note = document.createElement('div');
note.className = 'note';
note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
note.addEventListener('click', function() { return self.onNoteClick() }, false);
this.note = note;
// ...
}
O autor usa auto em alguns lugares (o corpo da função) e este em outros lugares (os corpos de funções definidas na lista de argumentos de métodos). O que está acontecendo? Agora que notei uma vez, começarei a vê-lo em todos os lugares?
javascript
scope
closures
Thomas L Holaday
fonte
fonte
this
dentro de um retorno de chamada?"))Respostas:
Veja este artigo em alistapart.com . (Ed: o artigo foi atualizado desde que vinculado originalmente)
self
está sendo usado para manter uma referência ao original,this
mesmo quando o contexto está mudando. É uma técnica frequentemente usada em manipuladores de eventos (especialmente em fechamentos).Editar: Observe que o uso
self
agora é desencorajado comowindow.self
existe e pode causar erros se você não for cuidadoso.O que você chama de variável não importa particularmente.
var that = this;
está bem, mas não há nada mágico no nome.Funções declaradas dentro de um contexto (por exemplo, retornos de chamada, fechamentos) terão acesso às variáveis / funções declaradas no mesmo escopo ou acima.
Por exemplo, um retorno de chamada de evento simples:
fonte
var that = this;
Eu acho que o nome da variável 'self' não deve mais ser usado dessa maneira, pois os navegadores modernos fornecem uma variável global que
self
aponta para o objeto global de uma janela normal ou de um WebWorker.Para evitar confusão e possíveis conflitos, você pode escrever
var thiz = this
ouvar that = this
preferir.fonte
_this
that
" (com o qual meu cérebro nunca se acostumará).self
, desde que você o declare comovar
responsável; isso sombreará o global. Obviamente, se você esqueceu o nomevar
, também não funcionaria com outro nome.Sim, você verá em todos os lugares. É frequentemente
that = this;
.Veja como
self
é usado dentro de funções chamadas por eventos? Esses teriam seu próprio contexto, entãoself
é usado para conter othis
que entrouNote()
.O motivo
self
ainda está disponível para as funções, mesmo que elas possam ser executadas somente após a conclusão daNote()
função, é que as funções internas obtêm o contexto da função externa devido ao fechamento .fonte
self
não tem significado especial. Pessoalmente, prefiro usar um var chamado algo diferente,self
uma vez que freqüentemente me confunde, pois espero que "eu" seja uma palavra reservada. Então, eu gosto da sua resposta. E no exemplo do OP, eu prefirovar thisNote = this
ou similar.Também deve ser observado que existe um padrão de proxy alternativo para manter uma referência ao original
this
em um retorno de chamada se você não gostar dovar self = this
idioma.Como uma função pode ser chamada com um determinado contexto usando
function.apply
oufunction.call
, você pode escrever um wrapper que retorna uma função que chama sua função comapply
oucall
usando o contexto especificado. Veja aproxy
função do jQuery para uma implementação desse padrão. Aqui está um exemplo de como usá-lo:var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
pode ser chamado e terá sua versãothis
como o contexto.fonte
Como outros explicaram,
var self = this;
permite que o código em um fechamento se refira ao escopo pai.No entanto, agora é 2018 e o ES6 é amplamente suportado por todos os principais navegadores da web. o
var self = this;
idioma não é tão essencial quanto era antes.Agora é possível evitar
var self = this;
o uso de funções de seta .Nos casos em que teríamos usado
var self = this
:Agora podemos usar uma função de seta sem
var self = this
:As funções de seta não têm suas próprias
this
e simplesmente assumem o escopo anexo.fonte
.addEventListender("click", (x) => { console.log(x); });
você explicou o como e o porquê com muita clareza, e eu concordo que o uso das funções de seta faz mais sentido, mas ainda assim ... isso é uma programação terrível, preguiçosa, bagunçada.A variável é capturada pelas funções embutidas definidas no método
this
na função se referirá a outro objeto. Dessa forma, você pode fazer com que a função mantenha uma referência aothis
no escopo externo.fonte
É uma peculiaridade do JavaScript. Quando uma função é uma propriedade de um objeto, mais apropriadamente chamada de método, isso se refere ao objeto. No exemplo de um manipulador de eventos, o objeto que contém é o elemento que acionou o evento. Quando uma função padrão é chamada, isso se refere ao objeto global. Quando você aninha funções como no seu exemplo, isso não se relaciona com o contexto da função externa. Funções internas fazer âmbito share com a função que contém, para que os desenvolvedores usarão variações
var that = this
, a fim de preservar a esse que eles precisam na função interna.fonte
Na verdade self é uma referência a window (
window.self
), portanto, quando você dizvar self = 'something'
que substitui uma referência de janela por si mesma - porque self existe no objeto window.É por isso que a maioria dos desenvolvedores preferem
var that = this
maisvar self = this;
De qualquer forma;
var that = this;
não está de acordo com as boas práticas ... presumindo que seu código será revisado / modificado posteriormente por outros desenvolvedores, você deve usar os padrões de programação mais comuns em relação à comunidade de desenvolvedoresPortanto, você deve usar algo como var
oldThis
/var oThis
/ etc - para ficar claro no seu escopo // ..é não muito, mas economizará alguns segundos e poucos ciclos cerebraisfonte
Como mencionado várias vezes acima, 'self' está sendo simplesmente usado para manter uma referência a 'this' antes de entrar na função. Uma vez na função 'this' refere-se a outra coisa.
fonte
thisss.sayHi.call (thatt);
fonte