Как установить постоянное значение переменной в javascript / jQuery? - PullRequest
0 голосов
/ 17 февраля 2012

Я создаю jquery ui, который можно сортировать с помощью cookie, чтобы поддерживать состояние при обновлении.
Вот важная часть кода:

for(i=0; i<counter; i++) {
    var connect = "";
    var count = 0;
    var tipo = "tipo" + i;
    for(j=0; j<counter; j++) {
        if(j != i) {
            if(count > 0) {
                connect = connect + ",.tipo" + j;
            }
            else {
                connect = ".tipo" + j;
                count++;
            }
        }
    }

    $( "." + tipo ).sortable({
        connectWith: connect,
        dropOnEmpty: "true",
        opacity: 0.8
    });

    $(".tipo" + i).sortable({
        activate: function(event, ui) {
            var order = $( "." + tipo ).sortable('toArray');
            createCookie(tipo, order, 1);
        },
        update: function(event, ui) {
            var order = $( "." + tipo ).sortable('toArray');
            createCookie(tipo, order, 1);
        },
        receive: function(event, ui) {
            var order = $( "." + tipo ).sortable('toArray');
            createCookie(tipo, order, 1);
        }
    });

}


Проблема, с которой я столкнулся, заключается в том, что var tipo = "tipo" + i; станет tipo2 в последнем утверждении и во всех предыдущих createCookie(tipo, order, 1); будет tipo как tipo2 вместо tipo0 или tipo1.

Надеюсь, вы понимаете, о чем я говорю.Если нет, просто скажите мне!

Но как я могу сделать так, чтобы это имело право tipo?

1 Ответ

3 голосов
/ 17 февраля 2012

Статья, на которую я ссылался, сводится к тому, что существует только один tipo, поскольку переменная существует в той же области видимости. Циклы for не создают новую область для каждой итерации.

Вам нужно заморозить переменную в новой области видимости, что возможно только с functions в JavaScript. Я также рекомендую использовать var для всех переменных (то есть всех ваших счетчиков циклов).

for(var i = 0; i < counter; i++) {
  (function() {
    var tipo = ...;
    // `tipo` is not changed by a second iteration because this is a new scope

    ...
  })();
}
...