2012-03-11 7 views
0

У меня возникли некоторые проблемы с логикой jQuery, которую я пишу. Я подозреваю, что делаю что-то не так с моими глобальными переменными, но я не совсем уверен, в чем проблема. Я регистрирую все, так как он работает, и по какой-то причине в моей функции rollDown(), хотя я использую id++, моя глобальная переменная id не обновляется (как показано в журналах).Глобальные переменные JavaScript, не обновляемые

Мне нужно обновить мою глобальную переменную, чтобы при щелчке header > a оператор else if запускал вместо очередного выстрела rollDown().

Вот соответствующий код:

var id = 0; 
var animSpeed = 0; 
var animDelay = 0; 
var working = 0; 
var items = 0; 

function logs() { 
    "use strict"; 
    console.log('id: ' + id); 
    console.log('-----'); 
    console.log('animSpeed: ' + animSpeed); 
    console.log('-----'); 
    console.log('animDelay: ' + animDelay); 
    console.log('-----'); 
    console.log('working: ' + working); 
    console.log('=============='); 
} 

function rollDown(items, id) { 
    "use strict"; 
    var dist = $('li').eq(id).outerHeight(), slideDown = {'margin-top' : '+=' + dist + 'px'}; 
    console.log('items: ' + items + ' & id: ' + id); 
    if (id <= items) { 
     if (id === 0) { 
      $('#toggle').html('Hide &uarr;'); 
     } 
     $('li').not($('li').eq(id).prevAll()).delay(animDelay).animate(slideDown, animSpeed); 
     id++; 
     logs(); 
     rollDown(items, id); 
    } else { 
     console.log('herp derp'); 
     logs(); 
    } 
} 

function getVals() { 
    "use strict"; 
    animSpeed = $('#speed').val(); 
    animDelay = $('#delay').val(); 
} 

function resetPosition() { 
    "use strict"; 
    $('li').stop().css('margin-top', 0); 
    id = 0; 
    working = 0; 
    $('#toggle').html('Show &darr;'); 
} 

$(function() { 
    "use strict"; 
    $('header > a').click(function() { 
     if (id === 0 && working === 0) { 
      getVals(); 
      items = $('ul').children().length; 
      var z; 
      for (z = 0; z < items; z++) { 
       $('li').eq(z).css('z-index', items - z); 
      } 
      working = 1; 
      rollDown(items, id); 
     } else if (id !== 0) { 
      resetPosition(); 
      alert('!!'); 
     } 
     return false; 
    }); 
}); 

Вот что моя консоль печатает:

items: 6 & id: 0 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 1 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 2 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 3 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 4 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 5 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 6 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 
items: 6 & id: 7 
herp derp 
id: 0 
----- 
animSpeed: 410 
----- 
animDelay: 20 
----- 
working: 1 
============== 

ответ

4

Вы id в качестве параметра, определенного в rollDown подписи метода. Если вы удалите его, ваша глобальная переменная будет корректно обновляться.

От:

function rollDown(items, id) { 

To:

function rollDown(items) { 

Вы также можете удалить items, как также определено в глобальном пространстве имен.

+0

** + 1 ** Может быть полезно отметить, что использовать глобальное пространство имен не самое лучшее, что можно сделать. – gdoron

0

, когда вы входите в свою переменную функции с именем id, как здесь: function rollDown(items, id) вы используете глобальную переменную.

использование:.

function rollDown(items){ 
Смежные вопросы