Разница между вызовом, привязкой и применением в javascript.

Call : (заимствование функций) =›заимствовать функции у других объектов и использовать их с данными какого-либо другого объекта.
call(reference)

Код:

let name = {
  firstName : "Siddharth",
  lastName : "Mishra",
  printFullName:function(){
    console.log(this.firstName +" "+ this.lastName);
  }
}
name.printFullName(); // Siddharth Mishra
// Now I want to use the function printFullName in other object.
let newName = {
   firstName: "Saurabh",
   lastName: "Shukla"
}
name.printFullName.call(newName);//Saurabh Shukla
// So here newName object borrowed the function printFullName from the name.

Код: (когда у нас есть дополнительный параметр)

let name = {
  firstName : "Siddharth",
  lastName : "Mishra",
}
let printFullName = function(hometown, state){
    console.log(this.firstName +" "+ this.lastName + " "+hometown +" "+state);
}
printFullName.call(name, "Bhadedoo", "Uttar Pradesh"); // Siddharth Mishra Bhadedoo Uttar Pradesh
// here we passed extra parameter as a second argument & third argument where 
// 1st argument is a reference
let newName = {
   firstName: "Saurabh",
   lastName: "Shukla"
}
printFullName.call(newName, "Noida", "Uttar Pradesh");//Saurabh Shukla Noida Uttar Pradesh

Применить. Единственная разница между вызовом и применением заключается в способе передачи аргументов. В call() мы передаем дополнительные параметры в виде строк, разделенных запятыми, но в apply() мы передаем эти параметры в виде массива.
Код: (как позвонить, так и подать заявку)

let name = {
  firstName : "Siddharth",
  lastName : "Mishra",
}
let printFullName = function(hometown, state){
    console.log(this.firstName +" "+ this.lastName + " "+hometown +" "+state);
}
printFullName.call(name, "Bhadedoo", "Uttar Pradesh"); // Siddharth Mishra Bhadedoo Uttar Pradesh
// here we passed extra parameter as a second argument & third argument where 
// 1st argument is a reference
let newName = {
   firstName: "Saurabh",
   lastName: "Shukla"
}
printFullName.call(newName, "Noida", "Uttar Pradesh");//Saurabh Shukla Noida Uttar Pradesh

// here we called apply method  extra parameters are in array
printFullName.apply(newName, ["Noida", "Uttar Pradesh"]); //Saurabh Shukla Noida Uttar Pradesh

Bind:метод bind() выглядит точно так же, как метод call(), но единственное отличие состоит в том, что вместо прямого вызова этого метода, например, printFullName.call(newName, «Noida», «Uttar Pradesh»),метод bind() связывает этот метод printFullNameс объектом и возвращает нам копию этой функции.

Code:(bind)

let name = {
  firstName : "Siddharth",
  lastName : "Mishra",
}
let printFullName = function(hometown, state){
    console.log(this.firstName +" "+ this.lastName + " "+hometown +" "+state);
}

let myName = printFullName.bind(name, "Noida", "Uttar Pradesh");//Saurabh Shukla Noida Uttar Pradesh
// Here the bind method will create a copy of printFullName and  bind it with 
// newName object and it will return a function (which can be called later).
// output 
// ƒ (hometown, state){
//    console.log(this.firstName +" "+ this.lastName + " "+hometown +" "+state);
// }

// Here we can see that it returns the function not values and now if we call 
// myname() then we get our results.
myName();
// output 
// Siddharth Mishra Noida Uttar Pradesh