> Что такое 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.
Пример кода
JAVASCRIPTconst 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 для сохранения контекста в асинхронном коде.
> Похожие задачи по JavaScript
Какие подходы и стратегии кэширования существуют в Node.js для улучшения производительности работы с базами данных
Что такое протокол HTTP и как он работает
Что такое Dependency Injection (DI)
Какие инструменты и подходы CI/CD вы применяли
> Похожие задачи по frontend
Что такое протокол HTTP и как он работает
Что такое паттерн Singleton
Что такое Dependency Injection (DI)
Какие инструменты и подходы CI/CD вы применяли
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью