Ответ вслух Junior this, call, apply, bind спрашивают часто обновлено

Как определяется this

Вопрос

Расскажите, как в JavaScript определяется this. Почему методы теряют контекст и как это исправить?

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

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

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

Коротко

Образцовый ответ: «У обычной функции this определяется в момент вызова. Проверяю по приоритету.

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

  • Для обычных функций `this` определяется способом вызова, а не местом объявления

  • Приоритет: `new`, затем `call`/`apply`/`bind`, затем вызов как метод, затем обычный вызов

  • Обычный вызов: `undefined` в строгом режиме, глобальный объект в нестрогом

  • Метод, переданный как колбэк (таймер, обработчик), вызывается без объекта и теряет `this`

  • Исправления: `bind`, стрелка-обёртка, поле-стрелка в классе

  • Стрелки берут `this` из внешней области и не перепривязываются

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

  • Чему равен this в обработчике события DOM?
  • Почему стрелку нельзя использовать как метод объекта?
  • Что победит: bind или new?

Разбор

Образцовый ответ: «У обычной функции this определяется в момент вызова. Проверяю по приоритету. Если функция вызвана через new, this это новый объект. Если через call, apply или привязана bind, это переданный объект. Если вызвана как метод, obj.method(), это объект слева от точки. Иначе это обычный вызов: в строгом режиме undefined, в нестрогом глобальный объект. Контекст теряется, когда метод отрывают от объекта: setTimeout(user.save) или передача в обработчик. Таймер вызывает функцию просто как fn(), объекта слева нет. Чиню через user.save.bind(user), через обёртку () => user.save() или, в классах, через поле-стрелку. Стрелки вообще живут по другим правилам: своего this у них нет, они берут его из окружения, поэтому стрелка внутри метода видит объект, а стрелка как метод объекта нет. bind перепривязать нельзя, но new сильнее bind».

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

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