【问题标题】:Javascript recursion -- seems like variable scope is messing things upJavascript递归——似乎变量范围搞砸了
【发布时间】:2014-01-26 09:13:37
【问题描述】:

我正在尝试通过在 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 的行时,它会进入递归,然后从下层内部更新上层的变量。

如果我在 toPush 分配之后抛出一个 console.log(sections) ,则说明这一点很清楚。如果变量只限于递归函数的一个“级别”,则第一个部分日志将为空,因为该级别中没有任何内容填充它,但实际上是“[one]”。

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

这是一个非常奇怪/意外的错误(我是 JS 新手,没有看到这个范围界定问题),如果有人有任何建议,我将不胜感激。

【问题讨论】:

    标签: javascript recursion


    【解决方案1】:

    sections 是一个全局变量,所以它是一样的。在前面写上var

    【讨论】:

    • 哈。我不知道是这样的。我对整个 var 的事情非常不习惯——使用 Ruby,你根本不需要它。男人。我只是浪费了至少一个半小时试图弄清楚发生了什么。非常感谢。我会尽快检查答案。
    • @Sasha:那就不要从 C 或 Java 开始。您甚至必须为每个变量声明数据:P ;)
    • 不客气。如果可以的话,最好使用ES5 strict mode。这可以防止你犯这个错误。此外,您可以使用JSLint 验证您的代码。这会在您的代码中找到各种反模式。
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多