Встречается на 20% собеседований по JavaScript

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

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

Как это работает

Все три метода принадлежат объекту Function.prototype и доступны любой функции. Они решают проблему потери контекста, когда функция вызывается без ожидаемого this (например, при передаче метода объекта в качестве колбэка).

  • call(thisArg, arg1, arg2, ...) — вызывает функцию с указанным this и переданными аргументами по отдельности.
  • apply(thisArg, [argsArray]) — то же, что call, но аргументы передаются в виде массива (или массивоподобного объекта).
  • bind(thisArg, arg1, arg2, ...) — не вызывает функцию, а возвращает новую функцию, у которой this зафиксирован на thisArg, а часть аргументов может быть предзадана (частичное применение).

Пример

Рассмотрим функцию greet, которая использует this и принимает два аргумента:

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

// call: аргументы перечисляются через запятую
greet.call("Earth", "Hello", "Alice"); // "Hello, Alice. This is Earth"

// apply: аргументы передаются массивом
greet.apply("Earth", ["Hello", "Alice"]); // "Hello, Alice. This is Earth"

// bind: создаёт новую функцию, которую можно вызвать позже
const greetEarth = greet.bind("Earth", "Hello", "Alice");
greetEarth(); // "Hello, Alice. This is Earth"

Во всех трёх случаях this внутри функции равен строке "Earth", но bind не выполняет функцию сразу, а возвращает новую функцию greetEarth, которую можно сохранить и вызвать в любой момент.

Подводные камни

  • this в нестрогом режиме: если передать null или undefined как thisArg в call/apply, то в нестрогом режиме this будет заменён на глобальный объект (window в браузере, global в Node.js). В строгом режиме ("use strict") this останется null или undefined.
  • bind и частичное применение: bind позволяет зафиксировать не только this, но и первые аргументы. Это удобно для создания функций с предустановленными параметрами, но может привести к путанице, если не отслеживать порядок аргументов.
  • Потеря контекста при передаче метода: если передать метод объекта как колбэк (например, в setTimeout или обработчик события), this потеряет ссылку на объект. Использование bind — распространённый способ исправить это.
  • Производительность: bind создаёт новую функцию, что может быть незначительно затратнее, чем call/apply, но в современных движках разница минимальна.

Когда использовать

  • call — когда нужно вызвать функцию с конкретным this и аргументы известны заранее (например, для заимствования методов, как Array.prototype.slice.call(arguments)).
  • apply — когда аргументы уже находятся в массиве или массивоподобном объекте, и их нужно передать в функцию (например, при использовании Math.max.apply(null, numbers)).
  • bind — когда нужно создать функцию с фиксированным контекстом для последующего использования: колбэки, обработчики событий, частичное применение аргументов.

Коротко

  • call и apply вызывают функцию немедленно; различие только в форме передачи аргументов: по отдельности или массивом.
  • bind возвращает новую функцию с привязанным this и, опционально, аргументами; вызов откладывается.
  • Все три метода полезны для управления контекстом this, особенно при работе с колбэками и методами объектов.
  • В нестрогом режиме null/undefined в thisArg заменяются на глобальный объект; в строгом — остаются как есть.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы