Весной стартует сезон найма, успей отхватить свой оффер!

Методы call, apply и bind в JavaScript

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

Метод call

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

Синтаксис call

func.call(thisArg, arg1, arg2, ...);

Пример использования call

const person = {
  name: "John"
};

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

greet.call(person, "Hello"); // выведет "Hello, John"

В этом примере this внутри функции greet указывает на объект person, потому что мы использовали call для привязки контекста.

Метод apply

Метод apply работает аналогично методу call, но аргументы передаются в виде массива.

Синтаксис apply

func.apply(thisArg, [argsArray]);

Пример использования apply

const person = {
  name: "John"
};

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

greet.apply(person, ["Hello", "!"]); // выведет "Hello, John!"

В этом примере мы передаем аргументы как массив в метод apply.

Метод bind

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

Синтаксис bind

const newFunc = func.bind(thisArg, arg1, arg2, ...);

Пример использования bind

const person = {
  name: "John"
};

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

const greetJohn = greet.bind(person); // создаем новую функцию с привязанным this
greetJohn("Hello"); // выведет "Hello, John"

Метод bind полезен, когда нужно заранее привязать контекст и передать функцию, которая будет вызвана позже.
Если вызвать bind несколько раз, то контекст будет привязан только один раз

const greetAgain = greet.bind(person).bind({ name: "Jane" });
greetAgain("Hi", "?"); // выведет "Hi, John?", потому что `bind` запоминает только первый контекст

Пример использования всех трех методов

const person = {
  name: "John"
};

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

// Использование call
greet.call(person, "Hello", "!");

// Использование apply
greet.apply(person, ["Hello", "!"]);

// Использование bind
const greetJohn = greet.bind(person, "Hello", "!");
greetJohn(); // выведет "Hello, John!"

Особенности bind:

Метод bind всегда возвращает новую функцию, в то время как call и apply сразу вызывают функцию с привязанным контекстом.