Почему в качестве this здесь worker?

Почему в этом коде:

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.call(this, x); // теперь 'this' передаётся правильно
    cache.set(x, result);
    return result;
  };
}

worker.slow = cachingDecorator(worker.slow); // теперь сделаем её кеширующей

alert( worker.slow(2) ); // работает
alert( worker.slow(2) ); // работает, не вызывая первоначальную функцию (кешируется)

на этой строчке let result = func.call(this, x); в качестве значения thisназначается функция worker?

Как это происходит и почему?
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
kaverza
@kaverza
Потому-что cachingDecorator возвращает функцию, ссылка на которую присвоена методу slow объекта worker.

вот альтернативные варианты записи

worker { 
    slow: function(x) {
        // this = worker
    }
}

worker.slow = function(x) {
  // this = worker
}


function test() {
   // this = window;
}
worker.slow = test; // передали по ссылке, теперь this = worker


const resFunc = cachingDecorator(worker.slow); // вернул функцию function(x), this = window
worker.slow = resFunc; // передали по ссылке, this = worker


советую почитать про замыкания, там более подробно все это описано.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Kentavr16
@Kentavr16
long cold winter
Почему бы не загуглить calljavascript?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы