2015-08-19 96 views
0

昨天,我在遞歸函數中出現了奇怪的行爲,這讓我感到沮喪。我設法重現並注意到其他行爲。基本上,下面的html/js中的變量似乎是全局的。輸出是4,然後是5.我使用FF 40.0.2。截至上週的最新版本的Node.js(ish)發生了同樣的問題。我沒有注意到它的版本號。在for-statments中聲明的變量似乎是全局的

什麼給?它應該像這樣嗎?問題消失我在每個for語句上面聲明瞭循環變量。

<head> 
    <script> 

    function foo(recurse) 
    { 
     if (recurse) 
     { 
     for (i = 0; i < 2; ++i) 
     { 
      foo(false); 
      console.log(i); 
     } 
     } 
     else 
     { 
     for (i = 0; i < 4; ++i) 
     {} 
     } 
    } 

    foo(true); 

    </script> 
</head> 

預期輸出:

0 
1 

實際輸出:

4 

不清楚該怎麼標記這一點。

+0

在JavaScript中,任何未聲明的內容都將存儲在Global(窗口)對象中。 嘗試console.log(window.i),你會知道的。 –

回答

1

好了,問題是,你沒有聲明他們,所以他們implicitly global。讓他們vars

function foo(recurse) { 
    if (recurse) { 
    for (var i = 0; i < 2; ++i) { 
//  ^^^ 
     foo(false); 
     console.log(i); 
    } 
    } else { 
    for (var i = 0; i < 4; ++i) {} 
//  ^^^ 
    } 
} 

foo(true); 

您也可以嘗試strict mode,在那裏你會得到一個未處理的錯誤Assignment to unresolved reference in strict mode code: i

+0

我想在'for-loop'之前放置'var i',因爲var使用函數作用域,在'for-loop'聲明似乎誤導了人們''i'只在'for loop'塊中可見。 – fuyushimoya

+0

@fuyushimoya:任何js程序員都知道'var'是函數範圍的:-) – Bergi