Различие методов 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 и принимает два аргумента:
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заменяются на глобальный объект; в строгом — остаются как есть.
Похожие вопросы
- Как работает EventLoop23%
- Какой опыт во frontend23%
- Чем var отличается от const23%
- Расскажи про опыт работы с PostgreSQL20%
- Что такое макро и микро задачи20%
- В чем разница == и ===20%
- В чём разница между классической функцией и стрелочной20%
- Что знаешь о различии между function expression и function declaration20%
