A palavra this
A mesma função de rótulo pode dizer caneca, depois perder o objeto e em seguida dizer xícara. As chaves ficaram no lugar. Mudou a chamada. JavaScript escolhe this na chamada, não enquanto você digita a função.
Depois da chamada simples de método
A página dos métodos guardou uma função no objeto e rodou com product.tag(). Nessa forma, this era o objeto antes do ponto. A página parou ali. Aqui a função fica e a chamada muda: solta do objeto, apontada com call, travada com bind ou escrita como seta.
Cinco formas em que a chamada define this
📊 Método, solta, call, bind, seta
| Forma | Exemplo | Onde this cai |
|---|---|---|
| método | product.tag() |
o objeto antes do ponto |
| solta | let show = product.tag; show() |
não é esse objeto (undefined no modo estrito) |
| call | product.tag.call(cup) |
o objeto que você entrega a call, só nesta execução |
| bind | product.tag.bind(product) |
travado nesse objeto nas chamadas seguintes |
| seta | () => this.name dentro de outra função |
o this da função de fora, não o objeto antes do ponto |
Nomeie a chamada antes de ler this. Deixar a função no objeto não congela this. Quem decide é a chamada. bind decide de antemão para uma chamada posterior. Uma seta ignora a chamada e olha a função que a envolve.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
console.log(product.tag());
O ponto continua nomeando o objeto
product.tag() executa tag e põe this em product. O console escreve Mug. É a regra da página dos métodos, deixada aqui como linha de base. As quatro chamadas seguintes saem dessa linha de propósito.
"use strict";
let product = {
name: "Mug",
tag() {
if (this == null) {
return "missing";
}
return this.name;
}
};
let show = product.tag;
console.log(show());
Tire a função do objeto e a caneca vai com o ponto
show e product.tag são a mesma função. show() não tem objeto antes de um ponto, então no modo estrito this é undefined. A sentinela devolve missing. Sem a sentinela, this.name lança erro. Esta página fica no modo estrito para o resultado ser previsível. Um script solto pode apontar uma chamada nua para o objeto global.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let cup = { name: "Cup" };
console.log(product.tag.call(cup));
call empresta a função a um único objeto
product.tag.call(cup) ainda executa o tag da caneca, mas this é cup só nesta passagem. O console escreve Cup. product.name continua Mug. call não cola a função em cup. apply faz o mesmo trabalho quando os argumentos extras estão num array — este rótulo não precisa deles.
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let show = product.tag.bind(product);
console.log(show());
bind guarda o objeto para uma chamada solta posterior
bind devolve uma função nova. Dentro dela, this continua product mesmo que show() não tenha ponto. O console escreve Mug. O tag original não muda. Use bind quando um botão, um temporizador ou outra função for chamar o método sem o objeto na frente.
"use strict";
let shelf = {
name: "Shelf",
make() {
let product = {
name: "Mug",
tag: () => this.name
};
return product.tag();
}
};
console.log(shelf.make());
Uma seta não pega this no ponto
product.tag() parece chamada de método, mas tag é uma seta. Uma seta não tem this próprio. Ela usa o this de make, e make rodou como shelf.make(), então this é shelf. O console escreve Shelf, não Mug. Um método comum em product teria escrito Mug. As setas apareceram numa página anterior; aqui só se vê o que fazem com this.
Case a chamada com o trabalho
O objeto está antes do ponto? Leia this como esse objeto. Você tirou a função e não travou? Não espere o objeto. Outro objeto, uma só passagem? Use call. Uma chamada posterior sem ponto ainda deve ver a caneca? Primeiro bind. Escreveu uma seta? Olhe para fora, para a função que a envolve, não para o objeto antes do ponto. Construtor e classe também ajustam this, e ficam para uma página mais adiante. O próximo é JSON: texto que descreve dados, não outra regra para this.
Ponha um rótulo travado na página
Trave tag na caneca com bind e chame essa função nova sem ponto. Escreva o resultado num parágrafo.
<!DOCTYPE html>
<html>
<head>
<title>this-keyword — page</title>
</head>
<body>
<p id="line">…</p>
<script>
"use strict";
let product = {
name: "Mug",
tag() {
return this.name;
}
};
let show = product.tag.bind(product);
let box = document.getElementById("line");
box.textContent = show();
</script>
</body>
</html>
O parágrafo mostra Mug. show() não tem objeto antes de um ponto, e a linha ainda nomeia a caneca porque bind travou this. Mude só product.name, atualize, e o parágrafo acompanha. Próxima lição: JSON em JavaScript — texto que descreve dados, não uma regra nova para this.
Passos de prática
- Chame
product.tag()e leiaMug. - Copie a função para
show, chameshow()no modo estrito e leiamissing. - Chame
product.tag.call(cup)e leiaCup. - Trave
tagemproduct, chame a função nova sem ponto e leiaMug. - Rode
shelf.make()e leiaShelf, nãoMug. - Na demo HTML, mude só
product.name, atualize e leia o parágrafo.
Escorregões frequentes
- Tratar
thiscomo congelado só porque a função está no objeto - Chamar
show()no modo estrito e ainda esperarMug - Achar que
callcopiatagparacup - Esperar que
bindreescreva otagoriginal em vez de devolver uma função nova - Escrever uma seta no lugar do método e esperar o objeto antes do ponto
- Ler a página seguinte como outra regra de
this— JSON é um formato de texto para dados
Resumo
- A chamada escolhe
this, não as chaves object.method()põethisno objeto antes do ponto- Uma chamada solta no modo estrito não aponta
thispara esse objeto callpõethisno objeto que você passa, só nessa passagembinddevolve uma função cujothisfica travado- Uma seta usa
thisda função que a envolve - Uma chamada travada pode encher uma linha da página
- A seguir: JSON, texto que descreve dados
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo