есть сниппет 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) ); // работает, не вызывая первоначальную функцию (кешируется) JavaScript 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) ); // работает, не вызывая первоначальную функцию (кешируется) каким образом this на 18 строке получает контекст не своей функции, не функции выше, а именно обьекта worker? при этом не переданного в функцию на прямую. если передавать в функцию метод обьекта, то, как известно, контекст теряется. даже так this магически, с проебанным контекстом, понимает что ему нужен конкретный обьект переданный двумя оболочками выше в cachingDecorator. как? а главное почему так происходит? Ограничение ответов в теме: Автор темы разрешил отвечать в теме только этим группам (и вышестоящим): Местный, Команда форума и Кураторы.
из того до чего я смог допетрить, это то, что func на 18 строке является методом worker и this подсасывает this ближайшего к ней обьекта. но все ровно поебота какая-то
я феноменальный долбаеб: cachingDecorator становится методом обьекта и по этому this ссылается на worker. всем спасибо за внимание