2012-01-20 11 views
0

私は自分のコードでスコープの概念に本当に苦労しています。ループ内のコールバック関数

私は変数にclassNameを追加する 'コールバック'関数を作成しようとしています。それは関数の中にあるので、クロージャの概念を使用してコールバック関数にパラメータとしてグローバル変数を渡しています(クロージャの仕組みを理解できていません)。

var ePressCuttingsArray = $(".cPressCuttings"); 
var eSelectedPressCuttingsArray = []; 
var iIndexArray = []; 
for (var i = 0; i < 7; i++) { 
    var iIndexArrayValue; 
    // two conditions being checked in while loop, if random no. is not in global array (iIndexArray) & i var is equal to eSelectedPress... array 
    while (jQuery.inArray(((iIndexArrayValue = Math.floor(Math.random() * 14) + 1), iIndexArray) === -1) 
     && (i === eSelectedPressCuttingsArray.length)) 
    { 
     // to push a value at a position from array ePressCut... into eSelectedPress... array 
     eSelectedPressCuttingsArray.push(ePressCuttingsArray[iIndexArrayValue]); 
     // run a function to addClass to the recently pushed value in eSelectedPress... array 
     (function (i) { 
      $(eSelectedPressCuttingsArray[i]).addClass("cPressCuttingsDisplay0" + i) 
     } (i)); 
     iIndexArray.push(iIndexArrayValue); 
    } 
} 

なぜ誰かがクロージャーfuncを説明できますか。 ClassName "cPressCuttingsDisplay00"は常に正常に追加されますが、次のループ反復のclassNameが "cPressCuttingsDisplay01"であることはありません。

+2

私は、コールバックの任意の並べ替えが表示されないか、ここに閉鎖するために必要。あなたの無名関数は、あなたのループ内に直接その本体がある場合とは何も変わりません。 – Jacob

+3

このコードが何をすべきか説明できますか?私はそれを単純化する方法があると思う。 – Jacob

+1

変数の新しいスコープは、forループやifブロックのようなブロック内ではなく、関数を入力することによってのみ作成されることに注意してください。 http://bonsaiden.github.com/JavaScript-Garden/#function.closures – GregL

答えて

1

あなたはforループを使用して、あなたの目標を達成することができます:

var ePressCuttingsArray = $(".cPressCuttings").makeArray(); 
var eSelectedPressCuttingsArray = []; 
for (var i = 0; i < 7; i++) { 
    var idx = Math.floor(Math.random() * ePressCuttingsArray.length); 
    var selectedItem = ePressCuttingsArray[idx]; 
    selectedItem.addClass('cPressCuttingsDisplay0' + i); 
    eSelectedPressCuttingsArray.push(selectedItem); 
    ePressCuttingsArray.splice(idx, 1); 
} 
+0

よかったです。 「同じ繰り返しはありません」というロジックです。これは上記のwhileループで使用されました。修正されたコードは次のとおりです。 for(var i = 0; i <7; i ++) {var idx = Math.floor(Math.random()* ePressCuttingsArray.length); while(jQuery.inArray(idx、iIndexArray)=== -1) {var selectedItem = ePressCuttingsArray [idx]; $(selectedItem).addClass( "cPressCuttingsDisplay0" + i); eSelectedPressCuttingsArray.push(selectedItem); iIndexArray.push(idx); } } – Kayote

+0

問題は、idx値が配列eSelectedPressCuttingsArrayに見つからない場合は、式の残りの部分を実行する条件を使用しているwhileループで発生します。しかし、今度は、繰り返しノーと遭遇すると、ノーを越えるだけです。 &i値は増分を続けます。 ながら、おそらく正しい解決策ではありませんが、私はかなりのスプライシングは、繰り返し問題を解決する方法を把握didntの... – Kayote

+0

は、その非常にエレガントちょっと... \t VAR ePressCuttingsArray = $(「cPressCuttings。」)ではないが、それを選別しました。 \t var iIndexArray = []; \t for(var i = 0; i <6; i ++) \t { \t \t var idx = Math.floor(Math。random()* ePressCuttingsArray.length); \t \t IF(jQuery.inArray(IDX、iIndexArray)=== -1) \t \t { \t \t \t VARのSelectedItem = ePressCuttingsArray [IDX]。 \t \t \t $(selectedItem).addClass( "cPressCuttingsDisplay0" + i); \t \t \t eSelectedPressCuttingsArray.push(selectedItem); \t \t \t iIndexArray.push(idx); \t \t}他 \t \t { \t \t \t i--。 \t \t} \t} – Kayote

関連する問題