Усі три дозволяють явно задати this для звичайної функції:
fn.call(ctx, a, b)- викликає функцію одразу, аргументи передаються через кому.fn.apply(ctx, [a, b])- те саме, але аргументи - масивом.fn.bind(ctx, a)- не викликає, а повертає нову функцію з назавжди прив'язанимthis(і, за бажанням, частиною аргументів).
function greet(greeting, punctuation) {
return `${greeting}, ${this.name}${punctuation}`;
}
const user = { name: 'Оля' };
greet.call(user, 'Привіт', '!'); // 'Привіт, Оля!'
greet.apply(user, ['Вітаю', '.']); // 'Вітаю, Оля.'
const hello = greet.bind(user, 'Привіт');
hello('?'); // 'Привіт, Оля?'
Де це трапляється:
bind- щоб передати метод як колбек, не загубившиthis:button.addEventListener('click', this.onClick.bind(this)). Сьогодні частіше пишуть стрілкову функцію.- Часткове застосування:
const double = multiply.bind(null, 2). applyісторично використовували, щоб передати масив як аргументи:Math.max.apply(null, numbers). Тепер є spread:Math.max(...numbers).- Позичання методів:
Array.prototype.slice.call(arguments)- тепер замість цьогоArray.from().
Пастки: функцію, прив'язану через bind, повторний bind уже не перевизначить. А на стрілкові функції call, apply і bind щодо this не впливають узагалі.