2012-06-27 33 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