Что такое call, apply и bind в JavaScript?

«Что такое call, apply и bind в JavaScript?» — вопрос из категории JavaScript, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

call, apply и bind — это методы в JavaScript для управления контекстом выполнения функции, то есть значением this.

  • call() немедленно вызывает функцию с заданным контекстом this и отдельными аргументами.
    func.call(thisContext, arg1, arg2, ...);
  • apply() аналогичен call(), но принимает аргументы в виде массива (или массивоподобного объекта).
    func.apply(thisContext, [arg1, arg2, ...]);
  • bind() не вызывает функцию сразу. Он создаёт и возвращает новую функцию с навсегда привязанным контекстом this. Аргументы могут быть частично применены.
    const boundFunc = func.bind(thisContext, arg1);
    boundFunc(arg2); // Вызов позже

Ключевые отличия:

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

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

const userProfile = { name: 'Анна' };

function showMessage(greeting, punctuation) {
  console.log(`${greeting}, ${this.name}${punctuation}`);
}

// call
showMessage.call(userProfile, 'Привет', '!'); // Привет, Анна!

// apply
showMessage.apply(userProfile, ['Здравствуйте', '.']); // Здравствуйте, Анна.

// bind
const greetUser = showMessage.bind(userProfile, 'Добрый день');
greetUser('!'); // Добрый день, Анна!

В контексте тестирования (например, при юнит-тестировании с использованием Jest или Mocha) эти методы могут применяться для изоляции и тестирования функций, которые зависят от конкретного контекста this, позволяя подменять его на mock- или stub-объекты.