2015-01-14 70 views
3
var i,j; 
for (i=0; i<30; i++) { 
    for (j=0; j<10; j++) { 
     // do something 
    } 
} 

如何創建的javascript內部循環

for (var i=0; i<30; i++) { 
    for (var j=0; j<10; j++) { 
     // do something 
    } 
} 

第二種方式創建和破壞Ĵ30次,由於JavaScript的範圍邏輯變量?我更喜歡用第一種方式,但我不知道是否有區別。在那兒?

+4

'var'被吊起來。我個人認爲第一個更清潔,但它是相同的。 –

+2

關鍵在於你誤解了「javascript的範圍邏輯」,「for」語句沒有任何特殊的範圍,函數可以。 – adeneo

+0

'第二種方法創建並銷燬j 30次'如果使用'for(let j = 0; j <10; j ++)' –

回答

14

編號JavaScript hoists the variable declarations。所以,所有的變量聲明都會進入它們所在函數的頂部。因此,所有這些變量都只創建一次,並且每次在循環中都會更改它們的值。

+0

不會介意我中斷,但對於第二個例子來說,變量每次在頂部懸掛的頂部都會被覆蓋,因爲它每次都以var關鍵字開始。 –

+0

@ al-Zami號碼只有在有任務時纔會被覆蓋。 Javascript並沒有真正的自動初始化。 – Luaan

5

您的兩個版本都是平等的。沒有區別。變量j不會被創建和銷燬30次。

+0

爲您的假設提供有效的理論/實踐證明是理想的。 – VisioN

6

@thefourtheye和@Remigius Kijok的答案都是正確的。無論何時變量在函數內(或在全局範圍內)聲明和初始化,聲明都會被提升到該範圍的頂部。

您可以通過將您在函數中使用的for環路中的任意一個環繞起來,然後在瀏覽器中執行該功能來親自看到。具體來說,通過在函數頂部設置一箇中斷點,您可以看到所有變量都在函數執行之前聲明並初始化爲值undefined

var loopy = function() { 
    for (var i = 0; i < 5; i += 1) { 
    for (var j = 0; j < 3; j += 1) { 
     console.log('i is ' + i + ' and j is ' + j); 
    } 
    } 
}; 

loopy(); // place break point here 

Variable hoisting

正如你可以看到的照片,我使用的是Chrome的開發工具,並把對loopy()執行一個破發點。輸入函數後,但在執行任何for循環之前,變量i和j都被聲明,但undefined

+0

嗯,開發工具不是真正的最好的方式來證明這一點,因爲結果將取決於編譯器如何優化代碼(請參閱[我的答案])(http://stackoverflow.com/questions/21917271 /我的功能,不知何故,沒有按叔具有訪問到其父母閉合-IS-失蹤雜物/ 21918024#21918024))。然而,你可以通過顯示'function(){j = 0;的console.log(J); if(false){var j = 1; } console.log(j)}'打印'0 0' - 即使具有'var'的語句從未被評估過,'j'仍然存在並且可以保存一個值。 –

+0

如果你看一下範圍變量部分,你可以清楚地看到,在函數中執行任何代碼行之前,'i'和'j'變量是'未定義的'。 – wmock