Как реализовать свой bind
Вопрос
Как бы вы реализовали свой bind без использования встроенного? Проговорите решение.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Возвращаем новую функцию, которая вызывает исходную через `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 ошибок.