【问题标题】:Confuse about jquery queue and dequeue混淆jQuery队列和出队
【发布时间】:2012-06-27 09:25:59
【问题描述】:

我有一个数组,我想使用 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/

【问题讨论】:

  • 这里为什么需要使用queue?它主要用于排队动画。对于数组或对象元素的简单迭代,最快和最简单的方法是使用简单的for 循环。
  • @VisioN 原因不相关,是吗?他可能正在尝试理解这个概念。
  • @freakish fwiw,这个概念不太好应用。
  • @VisioN:其实我在一个复杂的应用程序中使用队列,其中数组是stroe函数,我想按顺序执行它们。对于一个简短的问题,我将其抽象出来

标签: jquery arrays for-loop queue


【解决方案1】:

这是一个范围界定问题。当你的函数在内部函数中被称为变量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 处停止,因为条件是在 递增之后检查的。

【讨论】:

  • 我还是不太明白为什么the condition is checked after incrementation,队列不是在循环中起作用吗?所以我认为在每个循环中都会执行queue
  • 是的,代码循环执行。它说“将函数F 附加到队列中”,但它调用函数F(我的匿名函数)。当函数 F 被调用时(当你出队时会发生这种情况),此时的 i 变量是什么?它设置为循环中的最后一个!因为循环结束了。发生这种情况是因为块不创建范围。但是函数确实如此,这就是为什么这被匿名函数打破了。您应该了解更多关于 JavaScript 范围的信息。这不是一个简单的方面,但非常很重要!
  • 太棒了!非常感谢!
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多