this в стрелочной функции, определенной внутри "обычной" функции

Прошу помочь разобраться в следующих вопросах:

1) Вопрос 1

const obj1 = {
  title: 'obj1',
  f: function() {
    return () => this
  }
}

const obj2 = {
  title: 'obj2',
  f: obj1.f
}

console.log('obj1.f === obj2.f: ', obj1.f === obj2.f) // true
console.log('obj2.f()().title: ', obj2.f()().title) // obj2

Как я понял, this стрелочной функции привязывается к объекту, где функция объявлена (или создана?).

В данном случае, объявление/создание стрелочной функции происходит внутри анонимной функции, чей контекст this определяется при вызове. До того как "обычная" анонимная функция будет вызвана — this будет иметь значение undefined (или не будет?), и, соответственно, this в стрелочной функции также будет undefined. Но очевидно, что это не так.

Как это вообще работает?

2) Вопрос 2

MDN

Выражения стрелочных функций ... лексически привязаны к значению this (но не привязаны к собственному this, arguments, super, или new.target)

Что означает "лексически привязаны к this"? Имеется ввиду, привязана к this в момент объявления или что-то другое?

Что означает "не привязаны к собственному this"? Насколько я понимаю, "функция" — это объект, который можно вызывать с помощью оператора(?) круглых скобочек(). "Внутри" уже созданного объекта, ключевое слово this будет ссылаться на сам объект.

Ок, в стрелочных функциях — это не так. В функциях-конструкторах — это тоже не так. В "обычных" функциях this ссылается на "контекст" вызывающего кода. То есть, никакая функция не имеет собственного this, а не только стрелочная? Или я не правильно понял, что такое "привязанность к собственному this"?

3) Вопрос 3

const obj = {
  a: 'a',
  b: this,
  f2: function(){
    console.log(this)
  }
}

console.log(obj.b) // undefined

Как это работает? В моем представление, это что-то вроде:

  1. с помощью операции фигурных скобочек выделятся область память под пока еще анонимный объект;
  2. в память выделяется область содержащая значение "а";
  3. в анонимном объекте, созданном на первом шаге, создается свойство "a", в которое помещается ссылка/значение созданное на шаге 2;
  4. создается свойство "b", в которую помещается ссылка на анонимный объект, созданный на шаге 1;
  5. выделяется память под анонимную функцию;
  6. в свойство "f2" помещается ссылка на анонимную функцию (шаг 5);
  7. идентификатор obj получает ссылку на созданный на объект (шаги 1-6).

Но, очевидно, это не так. Тогда какова последовательность шагов при создании объекта и почему свойство "b", не содержит ссылку на объект к которому оно относится.


Ответы (0 шт):