Fácil JavaScript
Corrigindo o contexto com bind
Enunciado
Dado o objeto usuario com a propriedade nome e o método dizerOla, crie uma função saudacao que seja uma versão do método dizerOla com o this fixado no objeto usuario. Em seguida, chame saudacao() e imprima a saudação correta.
Requisitos
- Use
bindpara fixar othis. - A função
saudacaodeve ser uma nova função. - A saída deve conter o nome do usuário.
Código inicial
const usuario = {
nome: 'Carlos',
dizerOla: function() {
console.log(`Olá, meu nome é ${this.nome}`);
}
};
// Crie a função saudacao usando bind e chame-a
Saída esperada
Olá, meu nome é Carlos
Ver dica
Use usuario.dizerOla.bind(usuario) para criar a função.
Mostrar solução
const usuario = {
nome: 'Carlos',
dizerOla: function() {
console.log(`Olá, meu nome é ${this.nome}`);
}
};
// Cria uma nova função com this fixado em usuario
const saudacao = usuario.dizerOla.bind(usuario);
saudacao(); // Olá, meu nome é Carlos
Passo a passo
- Definimos o objeto
usuariocom a propriedadenomee o métododizerOla. - O método
dizerOlausathis.nomepara acessar o nome do objeto. - Usamos
usuario.dizerOla.bind(usuario)para criar uma nova funçãosaudacaocomthispermanentemente ligado ausuario. - Chamamos
saudacao(), que executa o corpo do método original com othiscorreto. - O console imprime a saudação com o nome 'Carlos'.
Por que funciona
O método bind cria uma nova função que, quando chamada, tem seu this fixado ao primeiro argumento passado (neste caso, usuario). Assim, mesmo que a função seja chamada sem um objeto à esquerda (como saudacao()), o this dentro dela continua sendo usuario. Isso resolve o problema de perda de contexto.
Erros comuns
- Esquecer de chamar
bind:const saudacao = usuario.dizerOla; saudacao();resulta emthisglobal ouundefined(em modo estrito), ethis.nomeseráundefined. Corrija combind. - Passar o objeto errado:
usuario.dizerOla.bind({ nome: 'Outro' })fixathisem outro objeto, resultando em 'Outro'. Use o objeto correto. - Usar arrow function no método: Se
dizerOlafosse uma arrow function,thisseria léxico ebindnão teria efeito. Prefira funções tradicionais para métodos que usamthis.
Outra forma de resolver
Podemos usar call para invocar imediatamente: usuario.dizerOla.call(usuario). Porém, bind é preferível quando precisamos de uma função reutilizável, como em callbacks.
Saída esperada
Olá, meu nome é Carlos