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) )
- В decorator передаем метод slow объекта worker
- worker.slow получает анонимную функцию из decorator
- метод slow хранится в func т.к. анонимная функция помнит место создания (короче лексическое окружение)
- console.log( worker.slow() ) вызывает анонимную функцию
- Она вызывает func(x) т.е. метод slow
- Выполняется alert("Called with " + x);
- А затем return x * this.someMethod();
- result получает x * this.someMethod();
- return возвращает x * this.someMethod();
- глобальное лексическое окружение получает x * this.someMethod();
- получаем undefined
- Верно скажите плиз?
window) методаsomeMethodпросто нет. – Sep 09 '19 at 01:15window), который можно перед вызовом функции не писать. – Sep 10 '19 at 02:14