Javascript奇怪行为中的递归

Javascript奇怪行为中的递归,javascript,Javascript,我正在努力找到这个问题的答案,为什么这段代码: (function h(){ var x = 1; return x; x = 2; })(); (function g(){ function g(){ return 1; } return g(); function g(){ return 2; } })(); 返回1,当此代码: (function h(

我正在努力找到这个问题的答案,为什么这段代码:

    (function h(){
        var x = 1;
        return x;
        x = 2;
    })();
    (function g(){
        function g(){ return 1; }
        return g();
        function g(){ return 2; }
    })();
返回1,当此代码:

    (function h(){
        var x = 1;
        return x;
        x = 2;
    })();
    (function g(){
        function g(){ return 1; }
        return g();
        function g(){ return 2; }
    })();
返回2

我已经对它进行了调试,在这两种情况下都使用了never goes pass return g()或return x part。
函数g中的递归部分应该在函数g()的第一个实现中调用函数g(),在该实现中返回1。

这是因为Javascript提升(位于顶部)任何函数定义。解释器将外部功能重新排序为:

(function g(){
    function g(){ return 1; }
    function g(){ return 2; }
    return g();
})();
第二个g()覆盖第一个,因此外部函数返回执行第二个g()的结果,即2

有关吊装的更多信息,请参见

要获得预期的结果,可以将函数指定为变量,这不会提升它们:

(function g(){
    var g = function(){ return 1; }
    return g();
    g = function(){ return 2; }
})()
这就是所谓的:

提升是JavaScript移动所有声明的默认行为 到当前范围的顶部(到当前脚本的顶部或 当前函数)

你应该小心这一点,并且,作为延伸,当JS试图帮助你时,你应该小心任何魔法,因为你没有受到约束