2012-01-20 66 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); 
    } 
} 

有人可以解釋爲什麼關閉功能。沒有正確執行,即它總是成功地添加className「cPressCuttingsDisplay00」,但不會在下一次循環迭代時使用「cPressCuttingsDisplay01」的className。

+2

我沒有看到任何形式的回調或需要關閉這裏。你的匿名函數與你的循環中直接使用它的主體沒有任何不同。 – Jacob

+3

你能解釋一下這段代碼應該做什麼嗎?我懷疑有一種方法可以簡化它。 – Jacob

+1

請注意,只有通過輸入函數才能創建變量的新作用域,而不是像for循環或塊一樣在塊內創建。另見: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

謝謝你,正在研究這個。 '不重複同一個號碼'的邏輯,我在上面循環時使用了它。這裏是修改的代碼: (var i = 0; i <7; i ++) {var idx = Math.floor(Math.random()* ePressCuttingsArray.length); (jQuery.inArray(idx,iIndexArray)=== -1) {var selectedItem = ePressCuttingsArray [idx]; $(selectedItem).addClass(「cPressCuttingsDisplay0」+ i); eSelectedPressCuttingsArray.push(selectedItem); iIndexArray.push(idx); } } – Kayote

+0

現在的問題是在while循環中我使用的條件是,如果在數組eSelectedPressCuttingsArray中找不到idx值,則執行表達式的其餘部分。但是,現在遇到重複否,它只是通過了否。 &i值繼續增加。 雖然也許不是正確的解決方案,但我並沒有很好地理解拼接如何解決重複問題... – Kayote

+0

排序它,它不是很優雅,但嘿... \t var ePressCuttingsArray = $(「。cPressCuttings」); \t var iIndexArray = []; (var i = 0; i <6; i ++) \t \t { \t \t var idx = Math.floorrandom()* ePressCuttingsArray.length); \t \t如果(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我 - ; \t \t} \t} – Kayote