Различие методов call apply bind

Методы `call`, `apply` и `bind` принадлежат к функциональному объекту `Function` и используются для указания контекста `this` при вызове функции. Хотя все три метода позволяют контролировать значение `this` внутри функции, между ними существуют ключевые различия в способе использования и поведении.

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

Пример:

function greet(message, name) {
  console.log(`${message}, ${name}. This is ${this}`);
}

greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"

Здесь он используется для вызова функции `greet` с `this`, установленным в `"Earth"`, и двумя дополнительными аргументами `"Hello"` и `"Alice"`.

apply
Очень похож на `call`, но принимает аргументы в виде массива, а не по отдельности.

Пример:

function greet(message, name) {
  console.log(`${message}, ${name}. This is ${this}`);
}

greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"

В этом случае он вызывает функцию `greet` с `this`, установленным в `"Earth"`, и аргументами, переданными в виде массива.

bind
Создаёт новую функцию, которая, когда она вызывается, имеет установленный контекст `this`, указанный в первом аргументе. В отличие от `call` и `apply`, `bind` не вызывает функцию сразу, а возвращает новую функцию, которую можно вызвать позже.

Пример:

function greet(message, name) {
  console.log(`${message}, ${name}. This is ${this}`);
}

const greetEarth = greet.bind("Earth", "Hello", "Alice");
greetEarth(); // "Hello, Alice. This is Earth"

Здесь он используется для создания новой функции `greetEarth`, которая при вызове выводит тот же результат, что и предыдущие примеры, но с тем отличием, что контекст `this` и аргументы были заранее заданы.

  • `call` вызывает функцию с указанным контекстом `this` и отдельными аргументами.
  • `apply` аналогичен `call`, но принимает аргументы в виде массива.
  • `bind` создаёт новую функцию с предустановленным контекстом `this` и аргументами, если они были предоставлены, но не вызывает её немедленно.

Эти методы позволяют более гибко управлять контекстом выполнения функций, что является мощным инструментом, особенно при работе с объектно-ориентированным кодом и асинхронными вызовами.

Feb. 22, 2024, easyoffer