簡體   English   中英

Javascript中的遞歸異常行為

[英]Recursion in Javascript strange behavior

我正在努力找到這個問題的答案,為什么這樣的代碼:

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

此代碼返回1:

    (function g(){
        function g(){ return 1; }
        return g();
        function g(){ return 2; }
    })();

返回2

我已經調試了它,並且在兩種情況下都不會超過返回g()或返回x部分。 函數g的遞歸部分應在函數g()的第一個實現中調用它,該函數返回1。

這是因為Javascript提升(帶到頂部)任何函數定義。 解釋器將您的外部函數重新排序為:

(function g(){
    function g(){ return 1; }
    function g(){ return 2; }
    return g();
})();

第二個g()覆蓋第一個g(),因此外部函數返回執行第二個g()的結果。

有關起重的更多信息,請點擊此處

為了獲得您期望的結果,您可以將這些函數分配為var,這不會使它們升降:

(function g(){
    var g = function(){ return 1; }
    return g();
    g = function(){ return 2; }
})()

這就是所謂的吊裝

提升是JavaScript的默認行為,即將所有聲明移到當前作用域的頂部(當前腳本或當前函數的頂部)。

您應該小心這一點,並擴展一下,因為您沒有紀律,所以JS在嘗試幫助您時會做的任何魔術都應小心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM