Разница между .call(), .apply() и .bind()?

В JavaScript методы .call(), .apply() и .bind() используются для управления контекстом выполнения функций, т.е. для указания, каким объектом будет this внутри функции.

1. .call()

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

function greet(greeting, punctuation) {
  console.log(greeting + ', ' + this.name + punctuation);
}

const person = { name: 'Alice' };

greet.call(person, 'Hello', '!'); // Output: "Hello, Alice!"
  • Аргументы передаются через запятую.

2. .apply()

Метод .apply() схож с .call(), но аргументы передаются в виде массива.

greet.apply(person, ['Hi', '...']); // Output: "Hi, Alice..."
  • Аргументы передаются в массиве.

3. .bind()

Метод .bind() не вызывает функцию немедленно, а возвращает новую функцию с указанным контекстом this, которая может быть вызвана позже.

const greetPerson = greet.bind(person, 'Hey', '.');
greetPerson(); // Output: "Hey, Alice."
  • Возвращает новую функцию, связанную с переданным контекстом this.

  • Позволяет передавать частичные аргументы (каррирование).

  • .call() — вызывает функцию с контекстом и аргументами, переданными по отдельности.

  • .apply() — вызывает функцию с контекстом и аргументами в виде массива.

  • .bind() — возвращает новую функцию с указанным контекстом, но не вызывает её сразу.