Что такое call, apply и bind в JavaScript и в чем их разница
Что проверяют
Понимаете ли вы явную привязку контекста и различаете ли немедленный вызов и создание новой функции.
Как отвечать
Все три задают this явно, но по-разному:
- call: вызывает сразу, аргументы через запятую;
- apply: вызывает сразу, аргументы массивом;
- bind: не вызывает, а возвращает новую функцию с навсегда привязанным контекстом.
function greet(greeting) { return `${greeting}, ${this.name}`; }
const user = { name: "Аня" };
greet.call(user, "Привет");
greet.apply(user, ["Привет"]);
const hello = greet.bind(user);
hello("Привет");Где это нужно на практике: восстановить контекст у метода, оторванного от объекта (setTimeout(user.hello.bind(user))); одолжить метод у другого типа (Array.prototype.slice.call(arguments)); частично применить аргументы, потому что bind умеет фиксировать и их.
Особенности: повторный bind ничего не меняет, привязка задаётся один раз. К стрелочной функции все три бессильны, у неё нет своего this. При вызове через new привязанный контекст игнорируется, создаётся новый объект.
Стоит добавить, что после появления спреда apply почти не нужен: f(...args) делает то же самое.
Где спотыкаются
Путают call и bind и удивляются, что функция не вызвалась.
Пробуют привязать контекст к стрелке.
Не знают, что bind умеет фиксировать аргументы.
Вызывают bind в теле компонента React на каждом рендере и создают новую функцию каждый раз.