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
Выражения стрелочных функций ... лексически привязаны к значению 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
Как это работает? В моем представление, это что-то вроде:
- с помощью операции фигурных скобочек выделятся область память под пока еще анонимный объект;
- в память выделяется область содержащая значение "а";
- в анонимном объекте, созданном на первом шаге, создается свойство "a", в которое помещается ссылка/значение созданное на шаге 2;
- создается свойство "b", в которую помещается ссылка на анонимный объект, созданный на шаге 1;
- выделяется память под анонимную функцию;
- в свойство "f2" помещается ссылка на анонимную функцию (шаг 5);
- идентификатор obj получает ссылку на созданный на объект (шаги 1-6).
Но, очевидно, это не так. Тогда какова последовательность шагов при создании объекта и почему свойство "b", не содержит ссылку на объект к которому оно относится.