Я испытываю сильное замораживание мозга, понимая функции стрелок и лексическую область видимости: некоторое время назад я прочитал все «Ты не знаешь JS» Кайла Симпсона, и мне показалось, что я достаточно хорошо понял область видимости и контекст. Но я просто не понимаю, как лексическая область действия функции стрелки применяется к объектам - я работал с классами в React, и там всегда ясно, что this
, с которым связана функция стрелки, является классом.
Например, в этом примере (из https://medium.com/tfogo/advantages-and-pitfalls-of-arrow-functions-a16f0835799e)
let obj = {
myVar: 'foo',
myFunc: function() {
console.log(this.myVar)
setTimeout(() => {
console.log(this.myVar)
}, 1000)
}
}
Функция стрелки должна правильно связывать this
, избегая выполнения bind
. Но это из лексической области видимости? В каком смысле? Поскольку следующая область действия - это функция myFunc
, а лексическая родительская область видимости этой функции - obj
?
Но тогда они приводят этот пример
let obj = {
myVar: 'foo',
myFunc: () => {
console.log(this.myVar)
}
}
obj.myFunc() // undefined
, где правильное связывание this
не происходит. Это потому, что нет функции, окружающей функцию стрелки, и поэтому следующая лексическая область видимости - это глобальный контекст?
Подводя итог: верно ли, что здесь «лексическая область видимости»это просто та же самая лексическая область, определяемая функциями, и что this
с функциями стрелок просто ищет родителя следующей содержащей функции?
I promто есть вы поняли это (или думали, что поняли) некоторое время назад, но «используйте это или потеряйте», я думаю -