8.1 Método call
Os métodos call, bind e apply em JavaScript desempenham um papel crucial na gestão do contexto de execução das funções, permitindo definir o valor de this ao chamar funções. Esses métodos são especialmente úteis ao trabalhar com objetos e programação funcional, fornecendo ferramentas poderosas para gerenciar o código de forma flexível. Bora dar uma olhada em cada um deles mais detalhadamente e explorar alguns exemplos de uso.
O método call invoca uma função com um valor de this especificado e argumentos passados em formato separado por vírgulas. Isso nos possibilita especificar explicitamente o contexto no qual a função deve ser executada.
Sintaxe:
func.call(thisArg, arg1, arg2 ...);
Exemplo:
Neste exemplo, a função greet é chamada com o contexto de person, permitindo que ela utilize a propriedade name do objeto person.
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'John' };
greet.call(person, 'Hello', '!'); // Output: Hello, John!
8.2 Método apply
O método apply é semelhante ao call, mas passa os argumentos como um array. Isso é conveniente quando temos um array de argumentos que queremos passar para uma função.
Sintaxe:
func.apply(thisArg, [argsArray]);
Exemplo:
Este exemplo é semelhante ao anterior, mas os argumentos são passados como um array.
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'John' };
greet.apply(person, ['Hello', '!']); // Output: Hello, John!
8.3 Método bind
O método bind cria uma nova função que, ao ser chamada, define um valor específico para this. Os argumentos passados para bind são fixados na nova função. Isso permite criar funções com um contexto fixo.
Sintaxe:
const boundFunc = func.bind(thisArg, arg1, arg2 ...);
Exemplo:
Neste exemplo, é criada uma nova função boundGreet, que sempre será executada no contexto do objeto person.
function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'John' };
const boundGreet = greet.bind(person, 'Hello');
boundGreet('!'); // Output: Hello, John!
8.4 Análise detalhada do uso dos métodos
1. Uso de call para herança de métodos:
O método call é frequentemente usado para herdar métodos de um objeto para outro. Isso permite emprestar métodos e propriedades sem a necessidade de herança explícita.
Neste exemplo, o construtor Product é chamado no contexto do objeto Food, permitindo herdar as propriedades name e price.
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price, category) {
Product.call(this, name, price);
this.category = category;
}
const cheese = new Food('Cheese', 5, 'Dairy');
console.log(cheese); // Output: Food { name: 'Cheese', price: 5, category: 'Dairy' }
2. Uso de apply para passar um array de argumentos:
O método apply é útil quando queremos passar um array de argumentos para uma função que aceita parâmetros separados.
Neste caso, o array numbers é passado para a função sum como argumentos separados.
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
console.log(sum.apply(null, numbers)); // Output: 6
3. Uso de bind para criar função com contexto fixo:
O método bind permite criar funções com um contexto fixo, o que é especialmente útil ao lidar com eventos e callbacks.
Aqui, a função getX é vinculada ao objeto module com bind, permitindo obter corretamente o valor de x ao chamar a função.
const module = {
x: 42,
getX: function() {
return this.x;
}
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // Output: undefined
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // Output: 42
8.5 Exemplos da vida real
Exemplo de uso de call para empréstimo de método de array:
Neste exemplo, o método forEach do array é usado para o objeto arguments com call.
function printArguments() {
Array.prototype.forEach.call(arguments, function(item) {
console.log(item);
});
}
printArguments(1, 2, 3); // Output: 1, 2, 3
Exemplo de uso de apply para unir arrays:
Aqui, o método push é usado para unir dois arrays com apply.
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
Array.prototype.push.apply(array1, array2);
console.log(array1); // Output: [1, 2, 3, 4, 5, 6]
Exemplo de uso de bind para criar função parcial:
A função double é criada com o primeiro argumento fixado em 2 com bind.
function multiply(a, b) {
return a * b;
}
const double = multiply.bind(null, 2);
console.log(double(5)); // Output: 10
GO TO FULL VERSION