【问题标题】:Why are jQuery's callback arguments inconsistent?为什么jQuery的回调参数不一致?
【发布时间】:2011-04-06 10:54:00
【问题描述】:

jQuery 中的一个常见模式是一个方法,它接受一个回调,该回调传递一个数组元素及其在该数组中的索引。然而,哪个参数首先出现似乎完全随机。例如,来自http://api.jquery.com 的 jQuery 文档:

  • jQuery.each( collection, callback(indexInArray, valueOfElement) )
  • .each( function(index, Element) )
  • jQuery.map( array, callback(elementOfArray, indexInArray) )
  • .map( callback(index, domElement) )
  • jQuery.grep( array, function(elementOfArray, indexInArray), [ invert ] )
  • .filter( function(index) )

在三种情况下(jQuery.each.each.map),索引排在第一位。在另外两个(jQuery.grepjQuery.map)中,元素排在第一位。我知道现在已经设置了 api,但对我来说这似乎是一个严重的不一致。

我是否缺少某种模式,或者这只是随机的?应该解决这个问题,还是我应该闭嘴并记住它们?

【问题讨论】:

  • 不错!所以 PHP 的数组函数并不是唯一参数顺序不一致的。
  • 是的,这非常烦人:(。我必须查找每种方法的文档。

标签: jquery api method-signature


【解决方案1】:

这不是完全随机的。因为:

$.map( $('selector'), function(el, index) { /* element (DOMElement) is first, index optional */ } );
$('selector').map(function(index) { /* 'this' (DOMElement) is first.... index optional */ });

看到模式了吗?第二个例子有第二个参数,但只是为了方便传递,和this一样。

模式是第一个参数总是比第二个“更”重要,而最后一个参数应该是最不重要的(“更可选”)。因此,如果您只需要一个,则无需指定所有最不重要的参数。而对于$(...).each,通常您甚至不需要任何参数,因为this 只是您想要的。

【讨论】:

  • 选择器和上下文也一样。 $(myselector,mycontext) 上下文是可选的,这就是为什么它是第二个。
  • 有道理 - 好点!我开始生气了,但现在如果我这样想,我可能会记得!
  • 这并不能真正回答任何问题 - 在某些情况下,索引比元素更重要,但在其他情况下不是吗?并且“this”与第一个参数不一致。例如:$ ("selector").each(function(index, el) { // el === this } )
  • @pimlottc,是的,因为$(...).each(function(i, el) {...}) 在回调中将当前元素绑定为this,因此索引i 变得比元素el 作为参数更重要。而$.each( $(...), function(el, i) {...}),由于this 现在是window,因此参数被反转,因此使el 更重要而i 更少。很简单,不是吗?
  • @YanickRochon 根据“简单”一词的任何简单定义,我认为这不是“简单”。我们还必须记住哪些特定方法将有用的东西绑定到this(更不用说那个项目是什么),这会更好吗??
【解决方案2】:

这有时也让我感到沮丧——$.each 是我总是搞砸的那个。

我认为这是由于不同的人/团队在框架的不同部分工作。这是一个社区驱动的框架,所以可能没有人很早就发现它,而且现在这个框架已经如此广泛传播,他们无法在不破坏 Internet 上 35% 的网站的情况下修复它。

我认为它不会被修复——至少这是我的观点/态度。我只需要记住它们并希望最好!

【讨论】:

    【解决方案3】:

    由于 Javascript 允许您忽略不使用的参数(即,您可以定义一个只接受一个参数的回调函数,即使它会用两个参数调用),一般来说,第一个参数就是您所使用的参数最有可能正在使用。 (其实this这个变量通常是你最可能使用的数据项,后面是第一个参数等)

    【讨论】:

      【解决方案4】:

      根据https://learn.jquery.com/using-jquery-core/iterating/

      警告:$.map() 切换回调参数的顺序 [与 $().map$each()$().each() 相比]。 这样做是为了匹配原生 JavaScript .map() 方法 在 ECMAScript 5 中可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 2018-05-26
        • 2013-03-31
        • 2012-05-12
        相关资源
        最近更新 更多