簡體   English   中英

有人可以解釋這個JavaScript之謎嗎?

[英]Can someone explain this JavaScript mystery?

我用JavaScript編寫了一個簡單的遞歸函數,遇到了一些非常奇怪的行為。 起初,我認為這是瀏覽器中的錯誤,但是我在FireFox,Chrome和IE9中進行了嘗試,它們的行為完全相同。

下面的HTML文件在頁面加載時運行一個簡單的JS函數。 該函數是遞歸的(只調用一次)。 本質上,該函數創建一個新的Array對象並返回它。 奇怪的是,在函數遞歸調用自身之后,x和y引用同一對象,據我所知,這不應發生。 同樣,如果取消注釋返回x之前的最后一行,則不會顯示警報“ x == y”

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>JavaScript weirdness...</title>
<script type="text/javascript" language="javascript">
    function RecursiveF(n) {
        x = [ n ];

        if (n > 0) {
            y = RecursiveF(n - 1);
            if (x == y)
                alert('x == y');
        }

        //if (n == 0) return [ n ];

        return x;
    }
</script>
</head><body onload="javascript:RecursiveF(1);"></body></html>

是否有任何提示為什么此頁面會顯示“ x == y”警報?

默認情況下, xy是函數的所有遞歸調用共享的全局變量。 如果希望它們是本地的,請使用var關鍵字聲明它們。

您需要一個局部變量。

var x = [ n ];

就像前面的家伙說的那樣,問題是x和y不是局部變量,而是全局變量。 為什么現在引起沖突?

JavaScript在執行您的函數時所執行的操作是將x和y拉出到調用您的函數並在其中聲明它們的函數。 所以現在x和y在同一個范圍內。 因此,在您寫的地方:

y = RecursiveF(n - 1)

最終將發生的是

return x;

被執行,因此x的值將分配給y,從而導致

x == y

妳去 通過使用var語句將x和y聲明為局部變量,可以克服這一點。 這樣,您可以在每次函數調用時獲得它們的新表示,而不是覆蓋它們。

暫無
暫無

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

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