Ответ вслух Middle this, call, apply, bind обновлено

Как реализовать свой bind

Вопрос

Как бы вы реализовали свой bind без использования встроенного? Проговорите решение.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «myBind(ctx, ...preset) возвращает функцию bound(...args). Внутри она вызывает исходную функцию: fn.apply(ctx, [...preset, ...args]).

Что должно прозвучать в ответе

  • Возвращаем новую функцию, которая вызывает исходную через `call` или `apply` с сохранённым контекстом

  • Склеиваем частично применённые аргументы с аргументами вызова

  • Без встроенных `call`/`apply`: временно кладём функцию в свойство объекта под уникальным Symbol и вызываем как метод

  • Учитываем вызов через `new`: тогда игнорируем привязанный контекст

  • Сохраняем прототип, чтобы `instanceof` работал для экземпляров

  • Обрабатываем `null`/`undefined` как контекст

Что могут спросить следом

  • Как определить внутри обёртки, что её вызвали через new?
  • Зачем ключ-Symbol, а не обычное имя свойства?
  • Почему стрелочную функцию нельзя привязать?

Разбор

Образцовый ответ: «myBind(ctx, ...preset) возвращает функцию bound(...args). Внутри она вызывает исходную функцию: fn.apply(ctx, [...preset, ...args]). Это базовая версия. Если запрещено пользоваться apply, применяю трюк с методом: создаю уникальный ключ Symbol(), кладу функцию в ctx[key], вызываю ctx[key](...args), чтобы сработало правило вызова метода, сохраняю результат и удаляю свойство. Symbol нужен, чтобы не перетереть существующее поле. Для null подставляю globalThis или оставляю как есть, смотря на режим. Дальше new: если внутри bound проверка new.target истинна, вызываю исходную функцию как конструктор, new fn(...preset, ...args), и привязанный контекст игнорирую, так ведёт себя настоящий bind. Для instanceof можно выставить bound.prototype = fn.prototype. Стрелку привязать нельзя, потому что у неё нет своего this, apply его просто проигнорирует».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.