Почему код возвращает ошибку? [дубликат]

139
13 июля 2021, 17:10
На этот вопрос уже даны ответы здесь:
Потеря контекста вызова (5 ответов)
Закрыт 1 год назад.

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. Верно скажите плиз?
Answer 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))

READ ALSO
DHTMLX Gantt. Проблема с родителем в методе gantt.createTask()

DHTMLX Gantt. Проблема с родителем в методе gantt.createTask()

Помогите понять в чем проблема с методом ganttcreateTask()

130
Django валидация ajax форм

Django валидация ajax форм

В своем тренировочном проекте столкнулся с следующей проблемойВ проекте есть старницы где формы подгружаются динамически в виде таблице...

102
Как правильно писать if else?

Как правильно писать if else?

Вопрос про стандарты if и else

329