2014-01-26 32 views
0

我想通过在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,并没有看到这个作用域发出来的),如果任何人有任何建议,我将不胜感激。

回答

5

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

+0

哈。我不知道是这样。我对整个var的东西都没有用 - 用Ruby,你根本不需要这个。人。我只是浪费了至少一个半小时,试图弄清楚发生了什么。非常感谢。我会尽快检查答案。 – Sasha

+1

@Sasha:甚至不要从C或Java开始。你甚至必须声明每个变量的数据:P;) –

+0

不客气。如果可以的话,最好使用[ES5严格模式](http://www.yuiblog.com/blog/2010/12/14/strict-mode-is-coming-to-town/)。这可以防止你犯这个错误。此外,您可以使用[JSLint](http://www.jslint.com)验证您的代码。在你的代码中找到所有类型的反模式。 – zord