2012-06-27 3 views
0

У меня есть массив, я хочу использовать очереди Jquery и функцию печати, чтобы распечатать их:Confuse о очереди Jquery и DEQUEUE

var show = function (el) { //print function 
    console.log('el', el); 
} 

var arr = ["a", "b", "c", "d", "e"]; 
var que = $({}); 
for (var i in arr) { 
    que.queue('custom', function (next) { 
     show(arr[i]); 
     next(); 
    }) 
} 
que.dequeue('custom'); 

но вся информация печати e, почему это произошло как можно? print как порядок массива?

Второй вопрос: когда я пытаюсь изменить способ написания for петли, как:

for (var i = 0; i < arr.length; i++) { 
    //... 
} 

Вся информация печать будет undefined. Есть ли разница между двумя способами записи? Это всегда так же, не так ли?

Вот демо: http://jsfiddle.net/hh54188/L8ExM/

+1

Зачем вам нужно использовать 'queue' здесь? Это в основном полезно для анимации очередей. Для простой итерации через элементы массива или объекта самый быстрый и простой способ - использовать простой цикл 'for'. – VisioN

+0

@VisioN Причина не имеет значения, не так ли? Возможно, он пытается понять концепцию. – freakish

+0

@ freakish fwiw, концепция, которая не очень хороша для применения. – VisioN

ответ

0

Это вопрос обзорное. Когда ваши функции называются переменными i во внутренней функции, равно arr.length, поэтому arr[i] - undefined. Вы должны обернуть его анонимной функции:

var show = function (el) { 
    console.log('el', el); 
} 

var arr = ["a", "b", "c", "d", "e"]; 
var que = $({}); 
for (var i = 0; i < arr.length; i++) { 
    (function(i) { 
     que.queue('custom', function (next) { 
      show(arr[i]); 
      next(); 
     }); 
    })(i); 
} 
que.dequeue('custom'); 

Кроме того, при использовании for (var i in arr) вы получаете e, потому что цикл останавливается на последнем элементе, который 4. Первый цикл останавливается на 5, потому что условие проверяется после приращений.

+0

Я до сих пор не совсем понимаю, почему условие проверяется после incrementation', не работает ли очередь в цикле? Поэтому я думаю, что в каждом цикле будет выполняться 'queue' – hh54188

+0

Да, код выполняется в цикле. И он говорит «присоединить функцию' F' к очереди », но это ** не ** вызывает функцию' F' (моя анонимная функция ** есть **). Когда вызывается функция 'F' (что происходит, когда вы декомпретируете), что такое переменная' i' в этой точке? Он задан последним в цикле! Потому что цикл закончен. Это происходит, потому что блоки не создают область. Но функции выполняются, поэтому это нарушается анонимной функцией. Вы должны узнать больше о области видимости в JavaScript. Это нелегкий аспект, но ** очень важно! – freakish

+0

блестящий! Большое спасибо! – hh54188