Верните обёртку, которая вызывает исходную функцию через apply с закреплённым контекстом и объединяет заранее переданные аргументы с аргументами текущего вызова.
Создать пользовательскую реализацию Function.prototype.bind с поддержкой частичного применения
Верните обёртку, которая вызывает исходную функцию через apply с закреплённым контекстом и объединяет заранее переданные аргументы с аргументами текущего вызова.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно написать свою версию метода bind, который будет привязывать контекст функции и позволять передавать часть аргументов заранее.
const obj = {
a: 1,
say(arg1, arg2) {
if (arg1 !== undefined && arg2 !== undefined) {
console.log(this.a * arg1 * arg2);
} else {
console.log(this.a);
}
}
};
const fn = obj.say;
fn.bind(obj, 1)(2);
Ваша реализация должна корректно работать как в случае полной передачи аргументов, так и при их частичном предоставлении.
Ответ
Верните обёртку, которая вызывает исходную функцию через apply с закреплённым контекстом и объединяет заранее переданные аргументы с аргументами текущего вызова.
function myBind(context, ...preset) {
if (typeof this !== 'function') throw new TypeError('Expected function');
const original = this;
return function (...args) {
return original.apply(context, [...preset, ...args]);
};
}
const bound = myBind.call(obj.say, obj, 1);
bound(2); // печатает 2
При необходимости учебный метод добавляют как неперечисляемый Function.prototype.myBind, не заменяя стандартный bind. Обёртка сохраняет результат и исключения исходной функции. Это контракт обычного вызова; полноценный bind также поддерживает new и особенности прототипов, которые данным примером не реализованы.