开发者问题收集

jQuery.each() 未定义问题

2010-07-25
24938

我有以下代码

function myFunction(items) {
   // this prints out 11
   alert(items.length);

   $(items).each(function(i, item) {
       // item is undefined for some reason
   }
}

我警告项目的长度,它包含元素(准确地说是 11 个)。那么为什么存在 11 个项目,但 jQuery 仍然传递未定义的值?

3个回答

对此的唯一解释是 items 数组包含未定义的值,即:

items = [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined];

其他两个答案都完全不正确。 each 的第一个参数是索引,而不是值,并且 jQuery.fn.each 调用 jQuery.each。它们之间没有歧义。

Matt
2010-07-25

听起来您 没有 jQuery 包装器集 传递给您的函数。如果您传递 一个 数组 或一个 对象 ,则需要使用 jQuery 辅助函数 $.each() ,例如

$.each(items, function(index, element){
});

正如我在其他答案中多次提到的那样,使用 .each() 或 javascripts 原生 for..in 循环遍历数组是一种不好的做法。

如果您传递 数组 ,请使用标准 for 循环

编辑

事实证明,您实际上确实可以使用标准数组调用 jQuery 构造函数 。 但这样做似乎是很糟糕的因果,你无法调用所有 jQuery 方法中的 95%,除非你想让你的代码崩溃/损坏。

jAndy
2010-07-25

由于注释不允许漂亮的代码列表...(是吗?):

Animate 可以对任何内容起作用。据记录,它只对 CSS 属性起作用,但只是为了证明一点:

var foo = { x: 10, y: 12 }; 

$(foo).animate({ x: "+=20", y: "20" }, 1000, 
      function () { alert(foo.x + ":" + foo.y); }); 

将输出“30:20”。这有用吗?也许在日常工作中用不到。:)

数组的诀窍是您将在每个条目中设置相同的属性。示例:

var foo = [{ x: 10 }, { x: 20 }]; 

$(foo).animate({ x: "+=30" }, 1000, 
      function () { alert(this.x); }); 

输出“40”和“50”。

OdeToCode
2010-07-26