Médio JavaScript
Call, apply e bind na prática
Enunciado
Crie uma função apresentar que recebe idade e cidade e usa this.nome para montar uma frase. Depois, use call, apply e bind para invocar essa função com o objeto pessoa e os argumentos 30 e 'Rio de Janeiro'. Imprima o resultado de cada invocação.
Requisitos
- A função
apresentardeve usarthis.nome. - Use
callcom argumentos separados. - Use
applycom um array de argumentos. - Use
bindpara criar uma função e depois chame-a.
Código inicial
const pessoa = { nome: 'Mariana' };
function apresentar(idade, cidade) {
// complete
}
// Use call, apply e bind
Saída esperada
Mariana, 30 anos, de Rio de Janeiro
Mariana, 30 anos, de Rio de Janeiro
Mariana, 30 anos, de Rio de Janeiro
Ver dica
Lembre-se: call recebe argumentos separados por vírgula; apply recebe um array; bind retorna uma função.
Mostrar solução
const pessoa = { nome: 'Mariana' };
function apresentar(idade, cidade) {
console.log(`${this.nome}, ${idade} anos, de ${cidade}`);
}
// call: this e argumentos separados
apresentar.call(pessoa, 30, 'Rio de Janeiro');
// apply: this e array de argumentos
apresentar.apply(pessoa, [30, 'Rio de Janeiro']);
// bind: cria função com this fixo
const apresentarMariana = apresentar.bind(pessoa);
apresentarMariana(30, 'Rio de Janeiro');
Passo a passo
- Definimos o objeto
pessoacom a propriedadenome. - Criamos a função
apresentarque usathis.nomee os parâmetrosidadeecidade. - Usamos
apresentar.call(pessoa, 30, 'Rio de Janeiro'): o primeiro argumento é othis, os demais são passados individualmente. - Usamos
apresentar.apply(pessoa, [30, 'Rio de Janeiro']): o primeiro argumento é othis, o segundo é um array com os argumentos. - Usamos
apresentar.bind(pessoa)para criarapresentarMariana, que temthisfixo empessoa. Depois, chamamosapresentarMariana(30, 'Rio de Janeiro'). - Cada chamada imprime a mesma frase, pois o
thisé semprepessoa.
Por que funciona
call e apply invocam a função imediatamente, definindo o this para o primeiro argumento. A diferença está na forma de passar os argumentos: call aceita uma lista, apply aceita um array. bind não invoca a função; retorna uma nova função com o this fixado, que pode ser chamada depois. Todos permitem controlar explicitamente o contexto de execução.
Erros comuns
- Passar argumentos errados para
apply:apresentar.apply(pessoa, 30, 'Rio')causa erro, poisapplyespera um array como segundo argumento. Use[30, 'Rio']. - Esquecer de chamar a função após
bind:const f = apresentar.bind(pessoa);não executa; é precisof(30, 'Rio'). - Usar
callcom array:apresentar.call(pessoa, [30, 'Rio'])passaria um array comoidade, resultando em[30, 'Rio'] anos. Use argumentos separados.
Outra forma de resolver
Poderíamos usar Reflect.apply(apresentar, pessoa, [30, 'Rio de Janeiro']), que é equivalente ao apply. No entanto, call/apply/bind são mais comuns e legíveis.
Saída esperada
Mariana, 30 anos, de Rio de Janeiro
Mariana, 30 anos, de Rio de Janeiro
Mariana, 30 anos, de Rio de Janeiro