Объясните почему происходит ошибка в коде
Код из учебника по изучению js.
// сделаем worker.slow кеширующим
let worker = {
someMethod() {
return 1;
},
slow(x) {
// здесь может быть страшно тяжёлая задача для процессора
alert("Called with " + x);
return x * this.someMethod(); // (*)
}
};
function cachingDecorator(func) {
let cache = new Map();
return function(x) {
if (cache.has(x)) {
return cache.get(x);
}
let result = func(x); // (**)
cache.set(x, result);
return result;
};
}
alert( worker.slow(1) ); // оригинальный метод работает
worker.slow = cachingDecorator(worker.slow); // теперь сделаем его кеширующим
alert( worker.slow(2) ); // Ой! Ошибка: не удаётся прочитать свойство 'someMethod' из 'undefined'
Не понимаю почему происходит ошибка на строке (*), когда происходит вызов alert( worker.slow(2) ); Отчасти понимаю, что ошибка связана с глобальным контекстом выполнения, лексическим окружением, замыканием и с контекстом this. Но не понимаю почему при первом вызове alert( worker.slow(1) ); контекст this понимает что он вызван в контексте объекта Worker, и this = Object, но после так называемой обёртки: worker.slow = cachingDecorator(worker.slow);
При вызове alert( worker.slow(2) ); контекст this уже становится равным window, не понимаю почему в первом случае движок-js понимает в каком контексте выполняется и что нужно this присвоить значение Object'a, а во втором нет.