функция обратного вызова в цикле - PullRequest
0 голосов
/ 20 января 2012

Я действительно борюсь с концепцией области видимости в моем коде.

Я просто пытаюсь создать функцию обратного вызова, которая добавит 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", но не сопровождает это именем className "cPressCuttingsDisplay01" для следующей итерации цикла.

1 Ответ

1 голос
/ 20 января 2012

Вы должны быть в состоянии достичь своей цели, используя цикл 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);
}
...