Создать пользовательскую реализацию Function.prototype.bind с поддержкой частичного применения

Верните обёртку, которая вызывает исходную функцию через apply с закреплённым контекстом и объединяет заранее переданные аргументы с аргументами текущего вызова.

Короткий ответ

Что ответить на собеседовании

Верните обёртку, которая вызывает исходную функцию через 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 и особенности прототипов, которые данным примером не реализованы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее