Получить доступ

Как определяется this в JavaScript и чем стрелочные функции отличаются от обычных?

JuniorОсновы JavaScript
Ещё спрашивают так:
  • Чем call, apply и bind отличаются друг от друга?
  • Почему this потерялся в колбэке?
Коротко

В обычной функции this определяется в момент вызова: obj.method() — obj; простой вызов f() — undefined в строгом режиме; new F() — новый объект; call/apply/bind — заданный явно. Стрелочная функция своего this не имеет — берёт его из окружения, где создана.

  • call(ctx, a, b) и apply(ctx, [a, b]) вызывают сразу, bind возвращает новую функцию
  • Метод, переданный колбэком (setTimeout(obj.m)), теряет this
  • Стрелки нельзя вызвать через new, у них нет arguments

А ещё В классах обработчики часто объявляют стрелками в полях класса

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Правила по приоритету:

  1. new F() — this = новый объект;
  2. явная привязка — call, apply, bind;
  3. вызов как метода obj.f() — this = obj;
  4. простой вызов f() — undefined в строгом режиме (в модулях и классах он всегда строгий), иначе глобальный объект.

Потеря контекста: button.addEventListener("click", this.onClick) передаёт функцию без объекта. Решения: this.onClick.bind(this), стрелочная обёртка, метод-стрелка в поле класса.

Стрелочные функции лексически захватывают this и arguments внешней функции. Поэтому их удобно использовать в колбэках внутри методов, но нельзя делать методами объектов, которым нужен свой this.

Пример

const user = {
  name: "Аня",
  hi() { return this.name; },
  hiLater() { setTimeout(() => console.log(this.name)); },  // стрелка — this от hiLater
};
user.hi();             // "Аня"
const f = user.hi;
f();                   // undefined или ошибка — this потерян
const g = user.hi.bind(user);
g();                   // "Аня"

Что хотят услышать

  • Правила определения this.
  • Отличие стрелочных функций.
  • call, apply, bind и потеря контекста.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем