Javascript: bind (), call () и apply ()

js-программисты должны знать этот метод

### bind ()

Метод bind () создает новую функцию, при вызове которой для ключевого слова this установлено указанное значение.

const person = {
    name: 'Tom',
    salary: 15000,
    houseRent: function (amount, vat, tax) {
        return this.salary = this.salary - amount - vat - tax;
    }
};
const firstPerson = {
    name: 'Piter',
    salary: 20000
};
const firstPersonHouseRent = person.houseRent.bind(firstPerson);
firstPersonHouseRent(2000, 100, 20);
console.log(`${firstPerson.name} Balance : ${firstPerson.salary}`);
// Piter Balance : 17880

### call ()

Его можно использовать для вызова (вызова) метода с объектом-владельцем в качестве аргумента (параметра).

const person = {
    name: 'Tom',
    salary: 15000,
    chargeBill: function (amount, vat, tax) {
        return this.salary = this.salary - amount - vat - tax;
    }
};
const firstPerson = {
    name: 'Piter',
    salary: 20000
};
person.chargeBill.call(firstPerson, 2000, 100, 20);
console.log(`${firstPerson.name} Balance : ${firstPerson.salary}`);
// Piter Balance : 17880

### apply ()

Метод apply () используется для вызова функции, содержащей это значение, а аргумент содержит элементы массива.

const person = {
    name: 'Tom',
    salary: 15000,
    chargeBill: function (amount, vat, tax) {
        return this.salary = this.salary - amount - vat - tax;
    }
};
const firstPerson = {
    name: 'Piter',
    salary: 20000
};
person.chargeBill.apply(firstPerson, [2000, 200, 20]);
console.log(`${firstPerson.name} Balance : ${firstPerson.salary}`);
// Piter Balance : 17780

### Вызов против применения

Разница между call () и apply () заключается в том, что call () передает все аргументы после первого в вызываемую функцию, а apply () принимает массив в качестве второго аргумента и передает элементы этого массива в качестве аргументов.

person.call(thisArg, 1, 2, 3) VS person.apply(thisArg, [1, 2, 3])

NB: параметр, разделенный запятой для call () и Array для apply ().