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

С этим уточнением давайте начнем:

Apply и call используются одинаково. Они оба выполняют функцию в контексте или области действия первого передаваемого нами аргумента. Эти функции можно вызывать только для других функций.

Пример вызова:

function sum(a, b) {
  console.log(this.num + a + b);
}
const obj1 = { num: 2};
const obj2 = { num: 3};

sum.call(obj1, 1, 5); // output --> 8
sum.call(obj2, 1, 5); // output --> 9

Пример применить:

function sum(a, b) {
  console.log(this.num + a + b);
}
const obj1 = { num: 2};
const obj2 = { num: 3};

sum.apply(obj1, [1, 5]); // output --> 8
sum.apply(obj2, [1, 5]); // output --> 9

Привязка:

Bind может использоваться любой функцией. Он возвращает связанную функцию с соответствующим контекстом «this» для вызова исходной функции в более позднее время. Привязка полезна, когда функцию необходимо вызвать позже, особенно в определенных событиях.

Пример:

function sum(a, b) {
  console.log(this.num + a + b);
}

const obj1 = { num: 25 };
const obj2 = { num: 50 };

const obj1Sum = sum.bind(obj1);
const obj2Sum = sum.bind(obj2, 2, 3);

obj1Sum(2, 3); // output --> 30
obj2Sum();     // output --> 55

Надеюсь, это краткое объяснение окажется для вас полезным. Примеры довольно просты, но я считаю, что они достаточно ясны, чтобы уловить эти три концепции.

В настоящее время эти функции не получили широкого распространения, но вы можете найти их в любом коде, где в дальнейшем будете работать с устаревшим кодом. Например, если вы используете библиотеку с именем «Bluebird», весьма вероятно, что вам придется использовать функцию «bind».