2012-01-20 2 views
0

Я действительно борюсь с концепцией области видимости в своем коде.функция обратного вызова в цикле

Я просто пытаюсь создать функцию «обратного вызова», которая добавит имя класса к переменной. Поскольку он находится внутри функции, я передаю глобальную переменную в качестве параметров функции обратного вызова, используя концепцию закрытия (все еще не понимаю, как работает замыкание).

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); 
    } 
} 

Может кто-нибудь объяснить, почему функция закрытия. выполняется неправильно, т. е. он всегда успешно добавляет имя класса «cPressCuttingsDisplay00», но не следует за этим с классомName «cPressCuttingsDisplay01» для следующей итерации цикла.

+2

Я не вижу каких-либо обратного вызова или необходимость закрытия здесь. Ваша анонимная функция не делает ничего другого, чем если бы вы только что получили свое тело прямо в своем цикле. – Jacob

+3

Не могли бы вы объяснить, что должен делать этот код? Я подозреваю, что есть способ упростить его. – Jacob

+1

Обратите внимание, что новая область для переменных создается только путем ввода функции, а не внутри блоков, например, для циклов или блоков. Также см .: 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

thankyou, изучал это. Логика «no repeat the same no.», Для которой я использовал цикл выше. Вот измененный код: для (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

Проблема теперь связана с циклом while, в котором я использую условие, что если значение idx НЕ найдено в массиве eSelectedPressCuttingsArray, тогда выполните оставшуюся часть выражения. Однако теперь, когда он встречает повторение «нет», он просто передает «нет». & значение i продолжает увеличиваться. Хотя, возможно, это не правильное решение, но я не понял, как сплайсинг разрешит проблему повторения ... – Kayote

+0

Отсортировано, его не очень элегантно, но эй ... \t var ePressCuttingsArray = $ (".CPressCuttings"); \t var iIndexArray = []; \t для (вар я = 0; г <6; я ++) { \t \t \t вар IDX = Math.floor (Math.random() * ePressCuttingsArray.length); \t \t, если (jQuery.inArray (IDX, iIndexArray) === -1) \t \t { \t \t \t вар 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

Смежные вопросы