Мы знаем, что функции — это особый вид объектов. Функции также получают пару специальных методов, которые они наследуют от объекта-конструктора функции. мы поговорим о мощных методах call, apply и bind, которые позволяют нам вызывать функцию и устанавливать этупеременную вручную. давайте создадим объект:

let john = {
 name:"John",
 age: 26,
 callFun:function(){
  console.log(this.age);
 }
}

при вызове john.callFun() вывод будет 26.

john.callFun();
//Result is 26

Теперь давайте добавим сюда еще один объект для кого-то по имени Ким.

let kim = {
 name:”Kim”,
 age: 30
}

Теперь предположим, что мы хотим использовать метод callFun для объекта Kim, у которого нет этого метода callFun, верно? Для этого мы можем использовать метод call. Первым аргументом метода вызова всегда является установка этойпеременной.
Поэтому, если мы установим эту >переменная для kim, тогда этапеременная больше не будет john.

john.callFun.call(kim);
//Result is 30

Метод call позволяет нам установить эту переменную здесь, в первом аргументе, и мы устанавливаем для нее значение «kim», потому что мы хотели использовать метод callFun Джона. Итак, это метод вызова. Существует очень похожий метод, который называется методом применения, и единственное отличие состоит в том, что он принимает аргументы в виде массива, то есть всего два аргумента, первый этот переменная, а затем массив, куда попадают все остальные аргументы.

john.callFun.apply(kim,[args1,args2]);
//Example represtation

Привязка также очень похожа на метод вызова, поэтому она также позволяет нам явно установить эту переменную. Однако разница здесь в том, что bind не вызывает функцию сразу, а вместо этого генерирует копию функции
, чтобы мы могли ее где-нибудь сохранить. И это действительно может быть чрезвычайно полезно для создания функций с предустановленными аргументами.

let kimBindCall = john.callFun.bind(kim);
kimBindCall();

Приятного чтения!