Вы дважды используете имя inputFunc
. Возвращенная функция называется inputFunc
, поэтому она затеняет функцию обратного вызова, переданную в качестве параметра. Возвращенная функция вызывает inputFunc
, который является самим собой и вызывает бесконечную рекурсию, и в конечном итоге выдается ошибка «Превышен максимальный размер стека вызовов».
Чтобы исправить это, используйте другое имя или сделайте его анонимным в качестве имени в любом случае не нужен, вот рабочий код с некоторыми улучшениями:
function saveOutput(inputFunc, string) {
let obj = {};
return function (input) { // make it anonymous
if (input === string) {
return obj;
}
// improvement 1: the else block can be omitted here
return obj[input] = inputFunc(input); // improvement 2: no need to call inputFunc twice, just assign and return at the same time
}
// the return statement here is never reached because there is a return right before it so just remove it
}
Подробнее о затенении переменных здесь: Пример затенения переменных в javascript
Демо:
function saveOutput(inputFunc, string) {
let obj = {};
return function(input) {
if (input === string) {
return obj;
}
return obj[input] = inputFunc(input);
}
}
const multiplyBy2 = function(num) {
return num * 2;
};
const multBy2AndLog = saveOutput(multiplyBy2, 'boo');
console.log(multBy2AndLog(2));
console.log(multBy2AndLog(9));
console.log(multBy2AndLog('boo'));