Descomplicando call, apply e bind em JavaScript
Se você programa em JavaScript há algum tempo provavelmente já se esbarrou com alguma das seguintes funções “call”, “apply” ou “bind”.

Se você programa em JavaScript há algum tempo provavelmente já se esbarrou com alguma das seguintes funções “call”, “apply” ou “bind”. À primeira vista podem ser vistas como algo complexo, porém é um grande aliado do desenvolvedor quando a expressão this está inserida no código.
Call
O método call() é uma função capaz de alterar o valor this. Por padrão, o primeiro parâmetro que recebe é o valor do this e o demais parâmetros são da função que invoca o método Call.
No exemplo a seguir, criaremos um objeto e uma função que faz referência ao this sem ter o this referenciado em seu escopo.
const article = {
title: 'Descomplicando call, apply e bind',
language: 'JavaScript',
};
function print() {
console.log(`${this.title} em ${this.language}.`);
}
print();
// undefined em undefined.Como a função print e o objeto article não possuem nenhuma ligação, print vai imprimir undefined, pois procura o this.title e this.language no objeto global e não os encontra.
Nota: Tentar isso no modo estrito resultaria em
Uncaught TypeError: Cannot read property 'title' of undefined.
Nesse cenário, podemos utilizar o call para especificar o contexto de this do objeto article na função.
print.call(article);
// Descomplicando call, apply e bind em JavaScript.Apply
O Apply funciona exatamente como o método Call, porém seu segundo parâmetro recebe um Array dos parâmetros da função, enquanto o primeiro parâmetro continua recebendo o valor que será atribuído ao this. Vejamos um novo exemplo, mas agora utilizando o apply:
function sumNumbers(firstNumber, secondNumber) {
const sum = this + firstNumber + secondNumber;
console.log(sum)
}
sumNumbers.apply(5, [2, 7]) // 14Bind
O Bind por sua vez funciona de uma maneira diferente do call e do apply, ao invés de executar uma função, este retorna uma nova função. O seu primeiro parâmetro continua recebendo o valor que será atribuído ao this e os demais argumentos serão os parâmetros que definirão os valores atribuídos da primeira função.
Vejamos um exemplo a seguir:
function sumNumbers(firstNumber,secondNumber = 0) {
const sum = this + firstNumber + secondNumber;
console.log(sum)
}
const bindResultFunction = sumNumbers.bind(5)
bindResultFunction(5) // 10Na linha 7 com o método bind(5), definimos o valor de this e com a função retornada em bindResultFunction, definimos os valores que foram atribuídos aos parâmetros da primeira função – sumNumbers, como o parâmetro secondNumber foi inicializado com 0, o resultado final foi de 10.
Agora vejamos um novo novo exemplo definindo dois valores para os parâmetros da função:
function sumNumbers(firstNumber, secondNumber) {
const sum = this + firstNumber + secondNumber;
console.log(sum)
}
const bindResultFunction = sumNumbers.bind(5, 7)
bindResultFunction(5) // 17Arrow Functions
Arrow Functions não possuem um escopo para o this. Em vez disso, elas passam para um próximo nível de execução.
Como no exemplo abaixo:
const article = {
title: 'Descomplicando call, apply e bind em JavaScript',
regularFunction: function() {
console.log(this.title);
},
arrowFunction: () => {
console.log(this.title);
}
}
article.regularFunction(); // "Descomplicando call, apply e bind em JavaScript"
article.arrowFunction(); // undefinedPorém, em determinados cenários pode ser útil utilizar arrow functions enquanto o this faz referência ao contexto externo. Para esses cenários, podemos utilizar um construtor para executar a arrow function.
class Article {
constructor() {
this.title = 'Descomplicando call, apply e bind em JavaScript'
this.arrowFunction();
}
arrowFunction = () => {
console.log(this.title);
}
}
new Article() // Descomplicando call, apply e bind em JavaScriptConclusão
Neste artigo aprendemos os diferentes valores que o this pode receber utilizando os métodos call, bind e apply.








