Объясните почему происходит ошибка в коде

Код из учебника по изучению 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, а во втором нет.


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