2012-06-27 36 views
0

我有一個數組,我想使用jquery隊列和打印功能打印出來:混淆關於jQuery的隊列和出隊

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,爲什麼發生這種情況怎麼可以?打印就像數組順序?

第二個問題是,當我試圖改變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

我還是不太明白爲什麼'在增量後檢查,不在循環中的隊列函數嗎?所以我認爲在每個循環中將執行'隊列' – hh54188

+0

是的,代碼執行循環。它說「附加功能'F隊列」,但它**不**調用函數'F'(我的匿名函數**是**)。當函數「F」被調用(當你dequeque時發生),那個時候的'i'變量是什麼?它被設置爲循環中的最後一個!因爲循環完成。發生這種情況是因爲塊不會創建範圍。但功能確實如此,這就是爲什麼這是通過匿名函數破壞的原因。你應該學習更多關於JavaScript的範圍。這不是一個簡單的方面,但**非常重要! – freakish

+0

輝煌!非常感謝! – hh54188