2016-05-08 87 views
6
var 
startx = 0, 
starty = 0, 
endx = 12, 
endy = 100; 

for(startx;startx <= endx; startx+=1){ 
     for(starty; starty <= endy; starty+=1){ 
      console.log(startx, endx, starty, endy); 
    } 
} 

預期輸出:在Chrome 39+雙for循環在JavaScript

0, 12, 0, 100 
0, 12, 1, 100 
0, 12, 2, 100 
... 
0, 12, 100, 100 

0, 12, 0, 100 
0, 12, 1, 100 
0, 12, 2, 100 
... 
0, 12, 100, 100 
1, 12, 0, 100 
1, 12, 1, 100 
... 
12, 12, 100, 100 
;EOO 

輸出,這樣的問題是第一個for循環在startx的變量不重複。

你能告訴我它爲什麼不迭代嗎?

+0

MS Edge的確如此。 實際的Firefox也是如此。 –

回答

13

這是一個有趣的謎題。在我抓到它之前,我花了好幾次。

原因是starty在第一次迭代後未被重置,因此第二個for循環只會運行一次,因爲條件將始終爲false。

你想:

var startx = 0, 
    starty = 0, 
    endx = 12, 
    endy = 100; 

for (; startx <= endx; startx++) { 
    for (starty = 0; starty <= endy; starty++) { 
     console.log(startx, endx, starty, endy); 
    } 
} 

我還簡化了startx+=1startx++,這同樣適用於starty

我也會建議進入它自己編寫每個var聲明的習慣:

var a; 
var b; 

這使得它更容易停止調試時上。嘗試進入def(),不要進入abc()

var a = abc(), 
    b = def(); 

如何for循環分解:

for循環分爲3個部分:

for(initial; condition; after) 

initial循環之前被調用,可以安全地被忽略。

for(var i = 0; i < 10;) { 
    // code 
    i++; 
} 
+0

謝謝! (+ =是我自己的慣例 - 對我來說更加清楚:)) –

+0

你怎樣省略for循環的第一個參數?我以前從來沒有見過。它是否默認爲零? –

+0

它是可選的,它只是C後的古老東西,我相信 –

2
var startx = 0, 
starty = 0, 
endx = 12, 
endy = 100; 
for(startx;startx <= endx; startx++){ 
    for(starty; starty <= endy; starty++){ 
    console.log(startx, endx, starty, endy); 
} } 

這裏你的第二個for loop執行:
condition是,如果省略
after在循環的代碼相同的寫作後,就稱爲在循環中運行的代碼調用之前,將永遠是真實的100次因爲您的條件是starty <= endyendy屁股值100。當startx爲0時爲。完成第二個循環的執行後,startx增量爲1,再次處理繼續,直到它獲得12的值。瀏覽器顯示完整的結果,您可以控制它並向下滾動。你會得到你想要的結果。希望它對你有用。