Почему рекурсивная функция не наследует значение переменной из основной функции в js? - PullRequest
0 голосов
/ 30 марта 2020

let adder = () => {
  if (sum === undefined) {
    var sum = 0
  }
  sum = sum + 10
  console.log(sum)
  if (sum >= 100) {
    return sum
  }
  adder()
}

Пожалуйста, объясните, почему сумма = 0 каждый раз, когда активируется рекурсивная функция? Почему не накапливается?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Как насчет использования свойства замыкания?

const adder = (sum = 0) =>
  () => ++sum

const a = adder()
const b = adder()

console.log(a(), a(), a()) // 1 2 3
console.log(b(), b(), b()) // 1 2 3
console.log(a(), a(), a()) // 4 5 6
console.log(b(), b(), b()) // 4 5 6

Или дать сумматору параметр -

const adder = (sum = 0) =>
  (n = 1) => sum += n

const a = adder()
const b = adder()

console.log(a(10), a(10), a(10)) // 10 20 30
console.log(b(), b(), b()) // 1 2 3
console.log(a(), a(), a()) // 31 32 33
console.log(b(), b(), b()) // 4 5 6
0 голосов
/ 30 марта 2020

Переменные в javascript всегда находятся внутри функции, из которой они вызываются. Если вы определяете переменную sum внутри функции и вызываете функцию, , даже если это та же самая функция , эта функция не будет иметь доступа к переменной. Однако вы можете определить глобальную переменную, и внутренняя функция будет иметь к ней доступ. Однако это не рекомендуется и идет вразрез с концепцией рекурсии.

Решение 1 (глобальная переменная, не рекомендуется):

// note how this is declared outside of any function
var sum;
let adder = () => {
  if (sum === undefined) {
    // the var here is gone to avoid redeclaring at a local scope
    sum = 0
  }
  sum = sum + 10
  console.log(sum)
  if (sum >= 100) {
    return sum
  }
  // we also return the value
  return adder()
}

Решение 2 (рекомендуется правильная рекурсия):

// note how sum is an argument now
let adder = sum => {
  if (sum === undefined) {
    sum = 0
  }
  sum = sum + 10
  console.log(sum)
  if (sum >= 100) {
    return sum
  }
  // we pass sum in as an argument and return it
  return adder(sum)
}
...