2012-03-18 19 views
4

で複数の変数を宣言は、問題が最初forループ内で宣言された第2 forループ内iが同じiであるということである次のJavaScriptコード、forループ

// note: declaring i in this loop 
for(var i=0; i<args.length; i++) { 

    var elem = args[i]; 
    ... 

    if(elem.attr == 'class') { 

     // note declaring arr and i in this loop 
     for(var arr=elem.val.split(' '), i=0; i<arr.length; i++) { 

      element.classList.add(arr[classCt]); 
     } 
     continue; 
    } 
} 

を有します。

は、varコンストラクトでは、コンマで区切って複数の変数を宣言できると考えていました。第二のループにclassCtiを変更

は、コードが

+1

"2番目のループでclassCtに変更したとき、コードは期待どおりに機能しました。" – Niko

+0

'i'を' classCt'に変更しましたどこですか? second forループの 'i'は' var'で再び初期化していないので、最初のループと同じです。 –

答えて

7

を期待通りにあなたはそこだけ1つのスコープを持って働いていたので、同じ名前を持つ一つの変数が存在することができます。あなたはvarが複数の変数をコンマで区切って宣言できることは間違いないが、同じスコープ内で同じ名前の2つの異なる変数を宣言することはできません。すでに存在する変数を再宣言するだけです。

どちらかclassCtに変更し、または私が何を行うと、ネストされたループイテレータのための変数j(など)を使用します。

var i, j, k, l; 
for(i = 0; i < 10; i++){ 
    for(j = 0; j < 10; j++){ 
     for(k = 0; k < 10; k++){ 
      for(l = 0; l < 10; l++){ 
      } 
     } 
    } 
} 
+0

あなたは正しいです。ループが終了すると 'for'ループで宣言された変数が見えるので、スコープは' for'ループ自体に限定されません。 –

+3

@ccyoungそれは正しいです、JavaScriptはブロックスコープを使用するCのような他のいくつかの言語です。関数スコープを使用しています(すべての関数には独自のスコープがあり、グローバルスコープは1つあります)。ここではもっと読むためのリンクがあります:http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ – Paulpro

+0

@Niko - {}ブロックで新しいスコープを作成できると思っています - これは真実ではありませんか? –

1

あなたが唯一の範囲内で作業している、ループは作成されません。 varキーワードを使用しても、それは自分のものです。現在の関数スコープ内で変数を上書きしているだけなので、たとえば:

for (var i = 0; i < 10; i++) { 
     for (var i = 5; i < 10; i++) { 
      console.log(i); 
     } 
} 

5,6,7,8,9を印刷します。

あなたは一般的にJavaScriptで行われているような機能を使用してそれを実行しなければならない新しいスコープを作成する場合:

for (var i = 0; i < 10; i++) { 
    (function(i) { 
     for (var i = 5; i < 10; i++) { 
      console.log(i); 
     } 
    })(i) 
} 

これは自分のライン上の5,6,7,8,9を印刷します10回。

+0

しかし、 'var'を使用して関数にスコープを制限し、もしそうなら、forループ内で2つの変数を宣言する方法は? :p – Orwellophile