> Что такое call, apply и bind в JavaScript и в чем их разница (JavaScript)

Уровень: junior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: Mosline

Стек: Node.js, JavaScript

> Пример ответа

Короткий ответ

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

Подробное объяснение

В JavaScript значение this внутри функции определяется тем, как функция вызывается. Методы call, apply и bind дают возможность вручную установить this, что особенно полезно при работе с методами объектов или в callback-функциях.

call(thisArg, arg1, arg2, ...) - вызывает функцию немедленно. Первый аргумент - это значение this, последующие - аргументы функции, перечисленные через запятую.

apply(thisArg, [argsArray]) - вызывает функцию немедленно. Первый аргумент - this, второй - массив (или array-like object) с аргументами функции.

bind(thisArg, arg1, arg2, ...) - не вызывает функцию, а возвращает новую функцию с привязанным this и, опционально, частично заданными аргументами (каррирование). Эту новую функцию можно вызвать позже.

На практике

call удобен, когда нужно позаимствовать метод у другого объекта или вызвать функцию с известным количеством аргументов. apply пригождается, когда аргументы уже находятся в массиве (например, при работе с arguments или Math.max). bind часто используется в event handlers, setTimeout или для создания функций с фиксированным контекстом.

Пример: если у вас есть объект user с методом greet, а вы хотите вызвать этот метод в контексте другого объекта admin, используйте user.greet.call(admin). Для передачи массива аргументов - apply. Для сохранения контекста в callback - bind.

Пример кода

JAVASCRIPT
const user = { name: 'Alice' };
const admin = { name: 'Bob' };
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
// call - аргументы через запятую
greet.call(user, 'Hello', '!'); // "Hello, Alice!"
// apply - аргументы массивом
greet.apply(admin, ['Hi', '?']); // "Hi, Bob?"
// bind - возвращает новую функцию
const greetUser = greet.bind(user, 'Hey');
greetUser('.'); // "Hey, Alice."

Как отвечать на собеседовании

Начни с определения: это методы для привязки контекста. Затем кратко опиши разницу: call и apply вызывают функцию сразу, bind - возвращает новую. Упомяни, что apply принимает массив аргументов, а call - список. Приведи простой пример из практики, например, заимствование метода массива для array-like объекта. Не углубляйся в сложные сценарии, если не спрашивают.

Что проверяет интервьюер

Проверяется понимание работы this в JavaScript, умение управлять контекстом вызова и знание практических сценариев использования. Также оценивается способность различать похожие методы и объяснять их ключевые отличия.

Типичные ошибки

  • Путать call и apply: забывают, что apply требует массив, а call - список.
  • Думать, что bind вызывает функцию сразу.
  • Не учитывать, что bind поддерживает частичное применение аргументов.
  • Использовать bind там, где достаточно call/apply, или наоборот, забывать о bind для сохранения контекста в асинхронном коде.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью