Параметр закрытия не получает параметры, вместо этого просто он на стороне

#javascript #recursion #closures

#javascript #рекурсия #замыкания

Вопрос:

работа с рекурсией и замыканиями, но не получение правильного вывода. Блок рекурсии работает корректно, чтобы извлекать элементы, а затем добавлять их к общему числу.

но когда я пытаюсь реализовать закрытие проблемы, это не работает, и вывод — это просто функция вместо правильного вывода

 let arr = [1, 2, 3, 4, 5];

function add(arr, total = 0) {
    if (arr.length === 0) return total;
    // console.log(total, 'total')
    numberToAdd = arr[0];
    // console.log(numberToAdd, 'number to be added to the total')
    arr.shift();
    // console.log(arr, 'array after taking out the first element', arr.length); 
    // console.log('total before recursion', total)

    return num   add(arr, total   numberToAdd);

}

addTo15 = add(arr)

console.log(addTo15(100))

/** expected output: 115
 * 
 * instead this outputs
 * 
 * 100function(num) {
        return num   add(arr, total   numberToAdd) ; 
    }
*/ 

Комментарии:

1. Есть ли функция, имя num которой где-то не показано в сообщении? Также numberToAdd не был объявлен, поэтому он становится window свойством при запуске кода в неаккуратном режиме. Если num определено и установлено значение number, то addTo15() ошибки, потому что это не функция.

Ответ №1:

Ваш вопрос мне не совсем понятен, но я предполагаю, что вы хотите сделать что-то вроде этого:

 const addArrTo = ([n, ...ns]) => (num) =>
  n == undefined
    ? num
    : addArrTo (ns) (num   n)

const addTo15 = addArrTo ([1, 2, 3, 4, 5])

console .log (addTo15 (100)) 

который также может быть написан так, если он более знаком:

 const addArrTo = (arr) => (num) =>
  arr .length == 0
    ? num
    : addArrTo (arr .slice (1)) (num   arr [0])
 

или даже как

 function addArrTo (arr) {
  return function (num) {
    return arr .length == 0
      ? num
      : addArrTo (arr .slice (1)) (num   arr [0])
  }
}
 

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