2015-06-26 167 views
0

這很奇怪,我遇到了簡單的嵌套循環在javascript中的問題。Javascript嵌套for循環無法正常工作

我的代碼是這樣的:

var a = 0, b = 2048; 
var i = 0, l = 2048; 

for(; a < b; a++) { 
    for(; i < l; i++) { 
     console.log(a, b, i, l); 
    } 
} 

所以,雖然我很期待輸出這樣(0..2047), 2048, (0..2047), 2048,我有這樣的輸出:0, 2048, 0..2047, 2048,其中第一可變:a不能簡單地從迭代0至2047. 改寫概念:當內部循環正確迭代時,外部循環只在索引0處執行一次。

我確定這是一個簡單而愚蠢的問題,但我無法真正發現..

評論

非常感謝大家發現這個問題,這是令人難以置信的,我怎麼看不到這一點。我接受西蒙的答案,因爲它似乎更清潔,更優雅的對我說:

  • 他不能重新初始化變量作爲for(var i = 0;...)只是重置
  • 他包括在變量復位語句,而不是之後每次迭代
  • 他不聲明變量var a = 0, i = 0,然後復位,在每一個for語句
  • 他使用常規的增量
  • 他在片段開始時宣佈的每一個變量,而不是在不同的聲明它們的執行時間

再次感謝!

+1

其原因很簡單,因爲當我達到2048外環不能再次執行 – thoggy

回答

2

內循環之前,每次都只是初始化我在外環上。此後,我將永遠比我大。

嘗試這種情況:

var a = 0, b = 2048; 
var i = 0, l = 2048; 

for(; a < b; a++) { 
    for(; i < l; i++) { 
     console.log(a, b, i, l); 
    } 
    i = 0; 
} 
0

嘗試一個循環

var a = 0, b = 2048; 
 
var i = 0, l = 2048; 
 

 
for(; a <= b&&i<=l; a++,i++) { 
 
    console.log(a, b, i, l); 
 
}

有兩個迴路它,我永遠不會重置,所以只得到一次迭代,因此的 0, 2048, 0..2047, 2048

+2

這將不會產生預期的輸出 – smnbbrv

2

你不重裝結果i0之間的a循環。這裏的修補程序:

var a = 0, b = 2048; 
var i, l = 2048; 

for(; a < b; a++) { 
    for(i = 0; i < l; i++) { 
     console.log(a, b, i, l); 
    } 
} 
2

出現這種情況的原因是因爲你永遠不重置我,所以內循環只會在第一次迭代過程中發生:

var a = 0, b = 2048; 
var i = 0, l = 2048; 

for(a = 0; a < b; a++) { 
    for(i = 0; i < l; i++) { 
     console.log(a, b, i, l); 
    } 
} 
1

循環是這樣的:

爲= 0; itarates當我變成2048. 然後對於a = 1我是2048,因此我不是<升,因此不再進入循環。

var a = 0, b = 2048; 

for(; a < b; a++) { 
    var i = 0, l = 2048; 
    for(; i < l; i++) { 
     console.log(a, b, i, l); 
    } 
} 

我相信這是你想要的。

1

這是一個範圍問題。變量ai未在for循環的範圍中定義。定義他們這樣裏面:

var b = 2048, 
    l = 2048; 

for(var a = 0; a < b; a = a + 1) { 
    for(var i = 0; i < l; i = i + 1) { 
     console.log(a, b, i, l); 
    } 
} 

編輯:斜視是完全正確的,JavaScript不使用塊範圍,爲此,我誤以爲是這個問題。雖然,您應該始終考慮定義在for循環的聲明中增加的變量,以消除混淆/歧義。

+0

這不是一個範圍問題。你的代碼根本不會改變變量範圍。唯一的問題是未能在循環中重置「i」,而您的答案確實解決了這個問題。 –