0

let worker = {
  someMethod() {
    return 1;
  },

slow(x) { alert("Called with " + x); return x * this.someMethod(); // (*) } }

function decorator(func){

let cashe = new Map();

return function(x){

if(cashe.has(x)){
  return cashe.get(x);
}

let result = func(x);

cashe.set(x, result)

return result

}

};

worker.slow = decorator(worker.slow);

console.log( worker.slow(1) )

  1. В decorator передаем метод slow объекта worker
  2. worker.slow получает анонимную функцию из decorator
  3. метод slow хранится в func т.к. анонимная функция помнит место создания (короче лексическое окружение)
  4. console.log( worker.slow() ) вызывает анонимную функцию
  5. Она вызывает func(x) т.е. метод slow
  6. Выполняется alert("Called with " + x);
  7. А затем return x * this.someMethod();
  8. result получает x * this.someMethod();
  9. return возвращает x * this.someMethod();
  10. глобальное лексическое окружение получает x * this.someMethod();
  11. получаем undefined
  12. Верно скажите плиз?

1 Answers1

1

Потому что func внутри decorator оторвана от worker и вызывается в глобальном контексте.

let worker = {
  someMethod() {
    return 1;
  },
  slow(x) {
    alert("Called with " + x);
    return x * this.someMethod(); // (*)
  }
};

function decorator(func) { let cashe = new Map();

return function(x) { if (cashe.has(x)) { return cashe.get(x); }

let result = func(x);
cashe.set(x, result);
return result;

}; };

worker.slow = decorator(worker.slow.bind(worker)); // !!! bind console.log(worker.slow(1))

  • я вроде так и написал да ? – user349791 Sep 09 '19 at 01:04
  • @user349791 В пунктах 9 и 10 написана ерунда. –  Sep 09 '19 at 01:06
  • короче возвращается result и он вызывается в глобальном контексте; а т.к. у нас strikt use то будет undefined ? – user349791 Sep 09 '19 at 01:10
  • @user349791 Ошибка будет не из-из strict/не strict, а потому что у глобального объекта (в браузере - window) метода someMethod просто нет. –  Sep 09 '19 at 01:15
  • посмотрите правильно изменил алгоритм ? – user349791 Sep 09 '19 at 08:24
  • @user349791 я не понимаю смысла этой фразы: "глобальное лексическое окружение получает ..." –  Sep 09 '19 at 16:00
  • глобальное лексическое окружение - это скрипт; локальное лексическое окружение это блок кода, условные операторы, операторы цикла, функции – user349791 Sep 09 '19 at 16:12
  • worker.slow возвращаем анонимную функцию 2) в консоле вызываем worker.slow(1) 3) где func в данном случае будет функцией а не методом верно ?
  • – user349791 Sep 09 '19 at 23:22
  • @user349791 3) - неверно. Это все равно метод, только метод глобального объекта (в браузере - window), который можно перед вызовом функции не писать. –  Sep 10 '19 at 02:14
  • можете наглядно показать что происходит ? – user349791 Sep 10 '19 at 08:03