【问题标题】:Why would jquery's .each() callback have the indexInArray as the first argument instead of valueOfElement?为什么 jquery 的 .each() 回调将 indexInArray 作为第一个参数而不是 valueOfElement?
【发布时间】:2012-12-17 21:51:15
【问题描述】:

一个奇怪的问题,但是每次我使用jQuery.each() 时,我都想知道为什么indexInArray 是第一个参数而不是第二个(第二个当前是值本身),就像原生的array.forEach() 一样?

an identical, but unanswered question.each() 的 API 文档也获得了相当多的支持!

通常,我发现代码“作用于”值而不是索引,导致函数体中有一个未使用的变量(这使得 js(h|l)int 抱怨,有充分的理由我的想法)。那么,为什么值不是第一个参数呢?

这是早期版本中考虑不周的实现的遗留问题,还是有充分的理由?

【问题讨论】:

  • 这是他们的 API,他们可以让它返回任何他们想要的东西。在这一点上,向后兼容性可以防止任何更改。
  • 是的,我完全明白了,我只是想知道最初的决定背后的原因是什么。
  • 在大多数情况下,whilefor 循环会比这两种方法中的任何一种都快,所以如果您不喜欢它们,请考虑是否真的需要它们。

标签: javascript loops foreach jquery


【解决方案1】:

原因是foreach 的第一个参数,即值,在$.each 中不需要,因为jQuery 将它提供为this

因此,索引似乎更经常有用。这是一个很好的理由。

我写“出现”,因为这并非没有危险:this 与原始类型的值不完全相同:在这种情况下,值被包装为对象。

为什么危险?

原因如下:

[1, 2, 3].forEach(function(v) {
    if (v===2) console.log('found!');
});

控制台输出:

found!

现在使用 jQuery:

$.each([1, 2, 3], function() {
    if (this===2) console.log('found!');
});

输出是什么?

什么都没有。

(请注意,我在 this related question 中详细介绍了实现这一点。)

今天,随着人们越来越习惯于标准的 javascript 函数,可能会认为使用其他顺序会更好(这是Underscore.js 的选择)。首先提供索引的原因是好的,但可能还不够好。但也许这并不重要,因为我们可能不会继续使用$.each,因为foreach 已经普遍可用(至少对于数组而言)。

【讨论】:

  • this 的行为完全不同(因为它封装了对象中的任何值)。另外,我发现自己在回调周围也经常使用jQuery.eachjQuery.proxy,所以this 并不是特别有用。
  • 回复:“今天,随着人们越来越习惯于标准的 javascript 函数,可能会认为使用其他顺序会更好(这是 Underscore.js 的选择)。 " - mootools 也是如此。
猜你喜欢
  • 1970-01-01
  • 2019-12-07
  • 2011-04-06
  • 2021-02-26
  • 2020-01-15
  • 1970-01-01
  • 2017-05-14
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多