Em um arquivo JavaScript, vi:
function Somefunction(){
var that = this;
...
}
Qual é o propósito de declarar that
e atribuir this
isso a ele?
javascript
this
Chris
fonte
fonte
Respostas:
Vou começar esta resposta com uma ilustração:
Minha resposta originalmente demonstrou isso com o jQuery, que é apenas um pouco diferente:
Como
this
frequentemente muda quando você altera o escopo chamando uma nova função, não é possível acessar o valor original usando-o. Aliasing parathat
permite que você ainda acesse o valor original dethis
.Pessoalmente, não gosto do uso de
that
como apelido. Raramente é óbvio a que se refere, especialmente se as funções tiverem mais de duas linhas. Eu sempre uso um alias mais descritivo. Nos meus exemplos acima, eu provavelmente usariaclickedEl
.fonte
var self = this;
. A palavrathat
parece implicar que a variável é qualquer coisa, MASthis
.forEach
função recebe um segundo argumento opcional: qual é a ligação da função.colours.forEach(function(){/* 'this' is bound correctly --> */}, this);
Portanto, uma nota deve ser adicionada quevar that = this
não é realmente necessáriaforEach
.A partir de Crockford
JS Fiddle
Isso alerta ...
fonte
that
variável não é usada em seu exemplo. Faz parecer que apenas criar uma retenção de variávelthis
faz algo com o restante do código.Este é um truque para fazer com que as funções internas (funções definidas dentro de outras funções) funcionem mais como deveriam. Em javascript, quando você define uma função dentro de outra,
this
automaticamente é definido para o escopo global. Isso pode ser confuso porque você esperathis
ter o mesmo valor que na função externa.Isso é especificamente um problema quando você cria uma função como método de um objeto (como
car.start
no exemplo) e depois cria uma função dentro desse método (comoactivateStarter
). No nível superior, o métodothis
aponta para o objeto e é um método de (neste casocar
) , mas na função internathis
agora aponta para o escopo global. Isso é uma dor.Criar uma variável a ser usada por convenção nos dois escopos é uma solução para esse problema muito geral com javascript (embora seja útil também nas funções jquery). É por isso que o nome sonoro muito geral
that
é usado. É uma convenção facilmente reconhecível para superar uma falha no idioma.Como El Ronnoco sugere em Douglas Crockford, essa é uma boa idéia.
fonte
O uso de
that
não é realmente necessário se você fizer uma solução alternativa com o uso decall()
ouapply()
:fonte
Às vezes,
this
pode se referir a outro escopo e a outra coisa, por exemplo, suponha que você queira chamar um método construtor dentro de um evento DOM, nesse caso,this
se referirá ao elemento DOM e não ao objeto criado.HTML
JS
Demo
A solução acima irá assing
this
parathat
, em seguida, podemos e acesso a propriedade de nome dentro dosayHi
método a partirthat
, de modo que este pode ser chamado sem problemas dentro da chamada DOM.Outra solução é atribuir um
that
objeto vazio e adicionar propriedades e métodos a ele e depois devolvê-lo. Mas com esta solução, você perdeuprototype
o construtor.fonte
Aqui está um exemplo `
Assim, você pode ver que esse valor é de dois valores diferentes, dependendo do elemento DOM que você segmentar, mas quando você adiciona "that" ao código acima, altera o valor de "this" que está direcionando.
..... $ (that) .css ("cor de fundo", "# ffe700"); // Aqui o valor "that" é ".our-work-group> p> a" porque o valor de var that = this; portanto, mesmo estando em "this" = '.our-work-single-page', ainda podemos usar "that" para manipular o elemento DOM anterior.
fonte