Если у меня есть метод, использующий ключевое слово this
:
let myObject = {
logThis: function(){
console.info(this)
},
}
И я передаю его функции higherOrder
:
function higherOrder(callback){
callback()
}
higherOrder(obj.logThis)
this
будет ссылаться не на myObject
, а на объект, который вызывает higherOrder
(в данном случае объект окна).
Я понимаю, что это связано с изменением контекста его выполнения.
чего я не понимаю, так это почему, когда я оборачиваю его в анонимную функцию следующим образом:
higherOrder(function(){myObject.logThis()})
this
снова будет ссылаться на myObject
. Разве контекст выполнения не меняется?
Если я передаю его функции, которая существует в глобальной области видимости, не следует ли this
ссылаться на глобальную область видимости?
Я не могу понять, почему обертывание его анонимной функцией должно что-то изменить.
Использование анонимной функции заключает MyObj в замыкание. Лексическая область действия этого замыкания (контекст выполнения) теперь локализована для замыкания. Таким образом, this
также локализован для замыкания (и MyObj).
Вы можете обнаружить это, используя отладчик с точкой останова, установленной на вызове callback()
.
На этом изображении показана переменная структура с установленным замыканием:
Без оболочки функции лексическая область видимости — это та же область видимости, что и у функции higherOrder()
, которая является глобальной областью видимости. Опять же, это демонстрируется точкой останова в той же строке кода (обратите внимание на отсутствие замыкания):
Примечание: этот код запускается в узле, поэтому здесь нет объекта Window.
Я ответил на связанный вопрос здесь, который отвечает на вопрос о форме вызова
myObject.logThis()
в пункте 5.window
отображается как значениеthis
, когда вызов неквалифицирован (callback()
в посте), потому что код не находится в строгом режиме ( пункт 6).