Javascript递归 - 似乎变量范围搞乱了

Sas*_*sha 0 javascript recursion

我试图通过在javascript中创建数字到单词函数来改进我的JS.即,它需要1234并吐出"一千二百三十四".来自Ruby背景,并希望编写一些可以处理大量数字的递归,这就是我写的:

var smallNums = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'tweleve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
var suffixes = {"trillion": 1000000000000, "billion": 1000000000, "million": 1000000, "thousand": 1000, "hundred": 100};
var tens = {"ninety":90, "eighty":80, "seventy":70, "sixty":60, "fifty":50, "fourty":40, "thirty":30, "twenty":20}

function inWords (num) {
  sections = [];

  for (var word in suffixes) {
    var suffix_val = suffixes[word];
    if (num >= suffix_val) {
      suffix_multiplier = Math.floor(num / suffix_val);
      var toPush = inWords(suffix_multiplier) + " " + word;
      sections.push(toPush);
      num %= suffix_val;
    }
  }

  for (var word in tens) {
    var ten_val = tens[word];
    if (num >= ten_val) {
      sections.push(word);
      num -= ten_val;
    }
  }

  if (num > 0 || sections.length == 0) {
    sections.push(smallNums[num]);
  }
  return sections.join(' ');
}
Run Code Online (Sandbox Code Playgroud)

问题是,它不是输出"一千二百三十四",而是在这种情况下输出"两个二百三十四".我已经对逻辑进行了三重检查,我认为这与变量范围问题有关.基本上,看起来所有变量(比如sections数组)在递归级别上都是相同的.

因此,当第一个循环到达该行时,它会进入递归toPush,然后从较低级别内部更新高级变量.

这清楚的是,如果我console.log(sections)toPush任务之后抛出一个.如果变量只是作用于递归函数的一个"级别",则部分的第一个日志将为空,导致该级别中的任何内容都没有填充任何内容,但事实上它是"[one]".

无论如何,问题是如何使用Javascript进行递归编程.我可以指定变量不应该是全局的,也不能用于递归吗?或者,如果没有,Javascript-y处理这样的事情的方式是什么?

这是一个奇怪/意想不到的错误的地狱(我是JS新手,并没有看到这个范围问题),如果有人有任何建议,我会很感激.

zor*_*ord 5

sections是一个全局变量,这就是为什么它是相同的.var在它前面写一个.