我想通过在javascript中创建一个数字到词的函数来提高我的JS。即,它需要1234年,并吐出“一千二百三十四”。从红宝石背景的和想要写的东西递归可以处理庞大的数字,这是我写的:Javascript递归 - 看起来像变量范围正在搞砸
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(' ');
}
的问题是不输出“1234”,它的输出,在这种情况下,“两个二百三十四”。我三重检查了逻辑,我认为这与变量范围问题有关。基本上,它看起来像所有的变量(如sections
数组)在递归级别上是相同的。
因此,当第一个循环与toPush
碰撞到一行,然后从较低级别更新较高级别的变量时,它会跳入递归。
是什么让这个明确的是,如果我toPush
分配后抛出console.log(sections)
。如果变量的范围仅限于递归函数的一个“级别”,那么段的第一个日志将是空的,因为该级别中没有任何内容填充任何内容,但实际上它是“[one]”。
无论如何问题是如何处理这个在Javascript的递归编程。我可以指定一个变量不应该是全局的还是可用于递归?或者,如果没有,处理这种事情的Javascript-y方式是什么?
这是一个奇怪的/意外错误的地狱,找出(我是新来的JS,并没有看到这个作用域发出来的),如果任何人有任何建议,我将不胜感激。
哈。我不知道是这样。我对整个var的东西都没有用 - 用Ruby,你根本不需要这个。人。我只是浪费了至少一个半小时,试图弄清楚发生了什么。非常感谢。我会尽快检查答案。 – Sasha
@Sasha:甚至不要从C或Java开始。你甚至必须声明每个变量的数据:P;) –
不客气。如果可以的话,最好使用[ES5严格模式](http://www.yuiblog.com/blog/2010/12/14/strict-mode-is-coming-to-town/)。这可以防止你犯这个错误。此外,您可以使用[JSLint](http://www.jslint.com)验证您的代码。在你的代码中找到所有类型的反模式。 – zord