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

时间:2014-01-26 09:13:38

标签: 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(' ');
}

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

因此,当第一个循环使用toPush命中行时,它会进入递归状态,然后从较低级别更新高级变量。

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

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

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

1 个答案:

答案 0 :(得分:5)

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