bind()Function.prototype.bind() возвращает новую функцию с постоянно зафиксированным контекстом this и опционально предзаполненными (каррированными) аргументами — техника, известная как частичное применение.
Function.prototype.myBind = function (context, ...boundArgs) {
const fn = this;
return function (...callArgs) {
return fn.apply(context, [...boundArgs, ...callArgs]);
};
};
context — значение, на которое будет привязан this внутри исходной функции...boundArgs — аргументы, предзаполненные во время привязки (частичное применение)...callArgs — дополнительные аргументы, переданные в момент вызова возвращаемой функцииfn.apply(context, [...boundArgs, ...callArgs]) — вызывает исходную функцию с фиксированным контекстом и объединённым списком аргументовconst fn = this захватывает ссылку на исходную функцию, потому что this внутри возвращаемой функции будет указывать на другое значениеapply() используется вместо call(), потому что аргументы передаются в виде массиваbind()function greet(greeting, name) {
return `${greeting}, ${name}! I am ${this.title}`;
}
const boundGreet = greet.myBind({ title: "Dev" }, "Hello");
console.log(boundGreet("Alice"));
// Output: "Hello, Alice! I am Dev"
Этот упрощённый polyfill не обрабатывает случай использования оператора new — нативный bind() игнорирует привязанный контекст, когда возвращаемая функция используется как конструктор. Обработка этого граничного случая требует дополнительных проверок instanceof.
В кастомном полифилле bind() сохранение const fn = this необходимо, потому что this внутри возвращаемой функции будет ссылаться на глобальный объект или undefined, а не на исходную функцию, которая связывается.
Новый — ещё не проверен сообществом
Вы