Como corrigir o erro 'TypeError: Function.prototype.apply não funciona'?
O erro 'TypeError: Function.prototype.apply não funciona' em JavaScript ocorre quando tentamos chamar a função apply() em um contexto onde ela não é válida. Isso pode acontecer quando o objeto não é uma função ou quando o uso do apply() é feito de maneira inadequada.
O que é a função apply()?
A função apply() é um método de Function.prototype que permite que você chame uma função com um determinado valor de this e um array de argumentos. Por exemplo:
function saudacao(nome) {
console.log('Olá ' + nome);
}
saudacao.apply(null, ['João']);
Esse exemplo usa apply() para chamar a função saudacao, passando null como o valor de this e um array com o nome 'João' como argumento.
Quando o erro ocorre?
O erro 'TypeError: Function.prototype.apply não funciona' acontece quando você tenta usar o método apply() em um objeto que não é uma função. O método apply() só pode ser chamado em funções e não em outros tipos de objetos.
Exemplo de código com erro:
let objeto = {};
objeto.apply(); // Vai gerar o erro 'TypeError: Function.prototype.apply não funciona'
Neste caso, o erro ocorre porque o objeto não é uma função e, portanto, não tem o método apply().
Como corrigir esse erro?
- Certifique-se de que você está chamando
apply()em uma função válida:
Antes de usar o método apply(), verifique se o objeto em questão é realmente uma função. Caso contrário, evite chamar apply().
Exemplo de correção:
function saudacao(nome) {
console.log('Olá ' + nome);
}
saudacao.apply(null, ['João']); // Correto
- Use o método
call()se a diferença entreapply()ecall()não for relevante:
O método call() funciona de maneira semelhante ao apply(), mas a principal diferença é que call() espera os argumentos individuais, enquanto apply() espera um array. Se você não precisa de um array de argumentos, pode usar call().
Exemplo de uso do call():
saudacao.call(null, 'João'); // Correto, usando call() em vez de apply()
- Certifique-se de usar corretamente o valor de
thisdentro deapply():
Ao usar apply(), você pode especificar um valor para this. Certifique-se de que o valor de this seja válido, caso contrário, o comportamento pode ser inesperado.
Exemplo de uso do this com apply():
function saudacao() {
console.log('Olá ' + this.nome);
}
let pessoa = { nome: 'João' };
saudacao.apply(pessoa); // Correto, 'this' será 'pessoa'
- Usar
bind()em vez deapply()para fixar o valor dethis:
Se você precisa garantir que o valor de this seja sempre o mesmo, considere usar bind() em vez de apply(). O bind() cria uma nova função com um valor fixo para this.
Exemplo de uso do bind():
let saudacaoPessoa = saudacao.bind({ nome: 'João' });
saudacaoPessoa(); // Correto, 'this' será fixado em 'João'
Conclusão
O erro 'TypeError: Function.prototype.apply não funciona' geralmente ocorre quando tentamos chamar o método apply() em um objeto que não é uma função. Para evitar esse erro, certifique-se de que o objeto é realmente uma função, ou use métodos alternativos como call() ou bind(), dependendo do caso. Isso garantirá que seu código funcione sem problemas e com a melhor performance.
Como utilizar apply(), call() e bind() corretamente em JavaScript
É importante entender o comportamento dos métodos apply(), call(), e bind() ao escrever funções em JavaScript. Enquanto apply() e call() são usados para definir o valor de this, bind() cria uma nova função com esse valor fixo. Essas técnicas são poderosas para controlar o fluxo de execução, mas é fundamental usá-las de maneira correta para evitar erros como o 'TypeError: Function.prototype.apply não funciona'.
Algumas aplicações:
- Evite o erro de 'TypeError: Function.prototype.apply não funciona' certificando-se de que está chamando
apply()apenas em funções. - Use
call()quando os argumentos não forem passados como um array. - Use
bind()para garantir que o valor dethisseja sempre o mesmo.
Dicas para quem está começando
- Verifique sempre se o método
apply()está sendo chamado em uma função. - Se você estiver passando um único argumento, considere usar
call()no lugar deapply(). - Use
bind()quando precisar manter o valor dethisfixo durante a execução de uma função.
João Gutierrez
Desenvolvedor e arquiteto de software com ampla atuação em PHP, Node.js e Python.
Mais sobre o autor