Estoy trabajando con funciones de decorador y no quiero usar bind para pasar this valor aquí, sino que quiero usar una función de contenedor y ejecutar el código allí. Pero me enfrenté a este error -> Error de Uncaught RangeError: Maximum call stack size exceeded
Y aquí está el código:
let math = { multi(n, type) { if(type == 'double') { this.printSomething(n * 2); } else if (type == 'triple') { this.printSomething(n * 3); } }, printSomething(result) { console.log(result); } }; function cachingDecorator(func) { let cache = new Map(); return function(n, type) { if(cache.has(n)) return cache.get(n); let result = func(n, type); cache.set(n, result); return result; }; }; math.multi = cachingDecorator((n, type) => math.multi(n, type)); math.multi(10, 'double');Sin embargo, utilicé Chrome Developer Tools, pero no pude solucionar el problema.
Sé que este error ocurrió porque hay una recursividad. ¿Pero donde?
El problema es que está reasignando math.multi a la versión de almacenamiento en caché, luego la versión de almacenamiento en caché usa el valor reasignado aquí:
math.multi = cachingDecorator((n, type) => math.multi(n, type)); // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^En su lugar, debe recordar y usar el original:
const originalMulti = math.multi; math.multi = cachingDecorator((n, type) => originalMulti.call(math, n, type)); // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^ Tenga en cuenta que tuve que usar .call(math para asegurar que this sea correcto, ya que copié math.multi a una variable; llamarlo directamente más tarde no configura this correctamente.
Ejemplo en vivo:
let math = { multi(n, type) { if(type == 'double') { this.printSomething(n * 2); } else if (type == 'triple') { this.printSomething(n * 3); } }, printSomething(result) { console.log(result); } }; function cachingDecorator(func) { let cache = new Map(); return function(n, type) { if(cache.has(n)) return cache.get(n); let result = func(n, type); cache.set(n, result); return result; }; } const originalMulti = math.multi; math.multi = cachingDecorator((n, type) => originalMulti.call(math, n, type)); math.multi(10, 'double');