Коротка відповідь
juniorbind — створює нову функцію з прив’язаним this і опціональними аргументами; call — викликає функцію одразу з заданим this і аргументами, а apply — той самий виклик, але з масивом аргументів.
Повне пояснення
Що це і навіщо
- Методи
bind,callтаapplyдозволяють явно встановити контекст (this) при виконанні функції. Це корисно, коли потрібно передати метод об’єкта як колбек або змінити контекст у функціях, що працюють ізthis.
Ключові принципи/терміни
bind(thisArg, ...args)повертає нову функцію з прив’язаним контекстомthisArgі попередньо заданими аргументами.call(thisArg, arg1, arg2, ...)викликає функцію одразу з контекстомthisArgі списком аргументів.apply(thisArg, argsArray)викликає функцію одразу з контекстомthisArgі масивом аргументів.
Як це працює
- При виклику
bindстворюється замикання, яке зберігає посилання на оригінальну функцію і контекст. Коли нова функція викликається, вона передає збереженийthisі аргументи до оригіналу. callтаapplyпрацюють одразу: вони змінюють контекст виконання функції на момент виклику.
Практика і реалізація
const obj = { value: 42, get() { return this.value; } };
const boundGet = obj.get.bind(obj); // new function
console.log(boundGet()); // 42
function sum(a, b) { return a + b; }
sum.call(null, 1, 2); // 3
sum.apply(null, [3, 4]); // 7
Тестування
- У Jest можна перевірити контекст:
test('bind preserves this', () => {
const obj = { x: 10, fn() { return this.x; } };
const fn = obj.fn.bind(obj);
expect(fn()).toBe(10);
});
Особливості в контексті JS/TS Core
- У TypeScript типи
thisможна явно оголосити, що допомагає уникнути помилок при використанніbind. - У функціях, що не використовують
this, ці методи надлишкові.
Оптимізація, типові помилки та edge cases
bindстворює нову функцію, що може впливати на пам’ять при великій кількості викликів.applyприймає масив, тому при великому кількості аргументів варто розглянутиcall.- Якщо передати
nullабоundefinedякthisArg, контекст буде встановлено на глобальний об’єкт (Node.js –global, браузер –window).