Почему this равен undefined у стрелочной функции, созданной в области видимости const в JavaScript
Что проверяют
Понимаете ли вы, что у стрелочной функции нет собственного this, и назовёте ли верно, чему равен внешний контекст в конкретном месте: в модуле, в классическом скрипте, внутри метода. Формулировка вопроса подсказывает неверный ответ, и проверяют в том числе, попадётесь ли вы на неё.
Как отвечать
Начать с того, что const тут ни при чём. Литерал объекта не создаёт контекста для this, поэтому стрелка внутри него берёт this окружающего кода, то есть верхнего уровня файла.
const obj = {
value: 42,
method() { return this.value; },
arrow: () => this,
};
obj.method(); // 42
obj.arrow(); // undefined в модуле, globalThis в обычном скриптеЧему равен этот внешний this, зависит от того, где лежит код:
- ES-модуль, а значит и любая сборка через бандлер: на верхнем уровне
thisравенundefined, поэтому обращениеthis.valueдаст неundefined, аTypeError; - классический скрипт:
globalThis, обращение к отсутствующему свойству вернётundefinedмолча; - внутри обычной функции или метода: контекст этой функции, и вот там стрелка как раз полезна, она избавляет колбэк от потери получателя.
Где спотыкаются
Винят объявление через const. Замена на let или var ничего не изменит: поведение задаёт стрелка, а не способ объявления переменной, в которую положили объект.
Не различают два разных undefined. Одно дело значение свойства у глобального объекта, другое дело сам контекст: в модуле код падает с TypeError, и именно эта разница показывает, разобрался человек или запомнил вывод примера.
Пробуют починить это через bind, call или apply. На стрелке они молча не работают, контекст останется прежним. Единственное лечение это обычная функция или сокращённая запись метода.