2017-07-29 4 views
-1

空の配列で実行されたfor-loopを別のfor-loopで空の配列に入れ子にした場合、結果としてブラウザブロックの無限ループが発生するのはなぜですか?空でない配列に空の配列をループすると、無限ループが発生します。なぜですか?

var links = []; 

var anchors = ['a', 'b', 'c']; 

    // not empty loop 
    for(var i=0; i<anchors.length;i++) { 
     console.log(anchors[i]); 

     // empty loop 
     for(var i=0; i<links.length;i++) { 
      console.log(links[i]); 
     } 
    } 

for(var i=0; i<links.length;i++)のコードは評価されていないので、なぜこの動作ですか?第二のループが実行されると

答えて

3

は、0に(それが最初forループにおける最初のサイクルの後1に等しい'S)i変数がリセットされます。 2番目のサイクルがfirstサイクル(そしてiの値が1の場合)の最初のループと同じ状況が、最初のループによって再び0にリセットされます。そんなこと...世界の終わりまで。

Hovewerは - オリのように指摘 - あなたは、ループ内i変数を宣言するletを使用する場合は、すべてがスムーズに動作します。

var links = []; 
 

 
var anchors = ['a', 'b', 'c']; 
 

 
// not empty loop 
 
for (let i = 0; i < anchors.length; i++) { 
 
    console.log(anchors[i]); 
 

 
    // empty loop 
 
    for (let i = 0; i < links.length; i++) { 
 
    console.log(links[i]); 
 
    } 
 
}

+0

を評価しないのだろうか? "let"は変数をループスコープにするためですか? – AmintaCode

+1

@AmintaCode 'var'は最も近い関数ブロックにスコープされているので(あなたのコードを関数本体にラップしなかったので、グローバル変数のように動作します)、' let'は最も近い囲みブロックにスコープされます。 –

0

[OK]をネストされた配列がempyあるので、もし、その長さはそう、0:

for(var i=0; i<0;i++) { 
     console.log(links[i]); 
    } 

"i" が0になることはありませんし、ループは無限になります...

+0

配列が空の場合、長さは '0'です。 'i'が0で長さが0の場合、' i <0'条件は満たされません。ループは起動しません。そうではありません。 –

+1

@ kind-user、そうです....正しい答えはあなたです! – AmintaCode

0

このコードを実行すると、

for(var i=0; i<links.length;i++) 

1)変数代入された値0

2)links.lengthを得る - それは0 3)0 < 1ため、

console.log(links[i]); 

なぜ

関連する問題