Вопрос №56245 от пользователя Daniyar Zhanakhmetov в уроке «Особенности работы this со стрелочными функциями», курс «JS: Введение в ООП»

Daniyar Zhanakhmetov


const company = {
  f1: () => { // стрелочная функция
    console.log(this);
  },
  f2() { // обычная функция
    console.log(this);
  },
};

company.f1(); // undefined
company.f2(); // { f1: [Function: f1], f2: [Function: f2] }

Здесь мы видим точно такую же картину. Несмотря на то, что стрелочная функция описывается внутри объекта и вызывается из этого же объекта, контекст все равно связан с местом определения функции (лексическим окружением) – а это сам модуль.

Учитывая материал урока Лексическое окружение у меня возник вопрос:

Визуально стрелочная ф-я определена вроде бы в объекте company и контекст у этого объекта тоже есть. Но лексическое окружение создается в момент вызова конкретной функции и оно есть у модуля, в которое записаны все идентификаторы сущностей. Так как () => {} берет контекст только из лексического окружения места, где она определена и в данном случае он равен контексту модуля, можно сказать что в данном случае в лексическом окружении модуля местом определения стрелочной функции является сам модуль, хотя визуально она определена вроде бы в объекте, т.е интерпретатор видит этот код,

const company = {
  f1: () => { // стрелочная функция
    console.log(this);
  },
}

но идентификаторы company и f1 в лексическом окружении модуля как бы на одном уровне.

Верно ли я понимаю? Иначе как понять что стрелочная функция определена в модуле, когда мы видим что местом ее определения является вроде бы объект company?

Или может все проще: стрел. ф-я берет контекст только из лексического окружения, а так оно есть только у модуля в данном случае, то и контекст берется оттуда, хотя местом определения является объект, но глобально все определено в модуле?

1 0

Максим Литвинов

Да, здесь все проще. Контекст стрелочной функции зависит о того места, где она была определена. Обратите внимание на эту часть урока:

Стрелочная функция не имеет своего контекста, она связывается с лексическим окружением, то есть функцией, внутри которой определена стрелочная функция. Это очень важный момент. Именно функция верхнего уровня задаёт контекст стрелочной функции, а не что-то другое.

Здесь у стрелочной функции нет функции верхнего уровня, поэтому местом определения функции является сам модуль, несмотря на то, что визуально она находится в объекте.

2

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
27 октября 8 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
27 октября 8 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
27 октября 8 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
27 октября 8 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
27 октября 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Новый
Создает веб-приложения со скоростью света
27 октября 5 месяцев