Javascript 递归中的闭包

Javascript 递归中的闭包,javascript,recursion,scope,closures,Javascript,Recursion,Scope,Closures,我有两个javascript递归函数。 第一个函数按从右到左的顺序返回输入数字的位数 第二个函数按从左到右的顺序返回它们 function first(n){ if(n > 0){ m = Math.floor( n/10 ); v = ( n - m * 10 ) + " " + first(m); return v; } return ""; } function second(n){ if(n &g

我有两个javascript递归函数。 第一个函数按从右到左的顺序返回输入数字的位数 第二个函数按从左到右的顺序返回它们

function first(n){
    if(n > 0){
        m = Math.floor( n/10 );
        v = ( n - m * 10 ) + " " + first(m);
        return v;
    }
    return "";
}



function second(n){
    if(n > 0){
        m = Math.floor( n/10 );
        v = second(m) + " " + ( n - m * 10 );
        return v;
    }
    return "";
}
第一个函数的结果是

7 6 1 
1 16 167
第二个函数的结果是

7 6 1 
1 16 167
但我早就料到了

1 6 7 
我用PHP和JAVA测试了类似的代码,效果很好。
大概问题出在Javascript的闭包中。但我不知道如何修复它。

非常简单:您使用的是隐含全局变量:

function second(n)
{
    if(n > 0)
    {
        m = Math.floor( n/10 );
        //m is changing here ------\\will use lowest value of m
        v = second(m) + " " + ( n - m * 10 );
        return v;
    }
    return "";
}
解决办法是:

function second(n)
{
    if(n > 0)
    {
        //make declare it in the scope itself
        var m = Math.floor( n/10 );
        v = second(m) + " " + ( n - m * 10 );
        return v;
    }
    return "";
}
这仍然给您留下了邪恶的隐含全局
v
。如果我是你,我也会在本地声明
v

function second(n)
{
    var m, v = '';
    n = +(n);//coerce to number
    if (n > 0)
    {
        m = Math.floor(n/10);
        v = second(m) + ' '+ (n-m*10);
    }
    return v;
}
此功能按预期工作。
这个问题实际上与闭包本身无关,但它是由引起的。
将其与JS处理递归函数的方式结合起来,您就可以得到简单明了的输出

JS还没有真正的递归调用堆栈。上次我检查时,递归调用被有效地短路了(~=goto)。我记得读过Douglas Crockford关于这个主题的文章,关于它与调用堆栈有关。

虽然ES5的严格模式确实引入了TCO,而且应该在2013年底实现(ES6-Harmony)。我已经链接到了几个网站,如果你想了解更多关于这个问题的内容,很简单:你使用的是隐含的globals:

function second(n)
{
    if(n > 0)
    {
        m = Math.floor( n/10 );
        //m is changing here ------\\will use lowest value of m
        v = second(m) + " " + ( n - m * 10 );
        return v;
    }
    return "";
}
解决办法是:

function second(n)
{
    if(n > 0)
    {
        //make declare it in the scope itself
        var m = Math.floor( n/10 );
        v = second(m) + " " + ( n - m * 10 );
        return v;
    }
    return "";
}
这仍然给您留下了邪恶的隐含全局
v
。如果我是你,我也会在本地声明
v

function second(n)
{
    var m, v = '';
    n = +(n);//coerce to number
    if (n > 0)
    {
        m = Math.floor(n/10);
        v = second(m) + ' '+ (n-m*10);
    }
    return v;
}
此功能按预期工作。
这个问题实际上与闭包本身无关,但它是由引起的。
将其与JS处理递归函数的方式结合起来,您就可以得到简单明了的输出

JS还没有真正的递归调用堆栈。上次我检查时,递归调用被有效地短路了(~=goto)。我记得读过Douglas Crockford关于这个主题的文章,关于它与调用堆栈有关。

虽然ES5的严格模式确实引入了TCO,而且应该在2013年底实现(ES6-Harmony)。如果你想了解更多关于这件事的信息,我已经链接到几个网站

@jangofett:不客气,尽管如此,感谢某人帮助你的方式是投票/接受答案,而不是发布感谢-comment@jangofett当前位置不客气,但在这种情况下,感谢某人帮助你的方式是投票/接受答案,在内部函数变量之前使用“var”。在内部函数变量之前使用“var”。