为什么jQuery的回调参数不一致?
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.grep
, jQuery.map
)中,元素首先出现。 我知道api现在已经确定了,但这对我来说似乎是一个严重的不一致。
有没有我缺失的模式或者这只是随机的? 这应该修复还是我应该闭嘴并记住它们?
这不是完全随机的。 因为:
$.map( $('selector'), function(el, index) { /* element (DOMElement) is first, index optional */ } ); $('selector').map(function(index) { /* 'this' (DOMElement) is first.... index optional */ });
看模式? 第二个例子有第二个参数,但它只是方便传递,它与this
相同。
模式是第一个参数总是比第二个更“重要”,最后一个参数应该是最不重要的(“更可选”)。 因此,如果您只需要一个参数,则无需指定所有最不重要的参数。 在$(...).each
的情况下,你甚至不需要任何参数,因为this
只是你想要的。
有时候这让我感到沮丧 – $.each
都是我总是陷入困境的人。
我认为这是由于不同的人/团队在框架的不同部分工作。 它是一个社区驱动的框架,所以没有人可能很早就抓住它,现在框架如此广泛,他们无法修复它而不破坏互联网上所有网站的35%。
我不认为它会被修复 – 至少这是我的意见/态度。 我只需要将它们归于记忆并希望最好!
由于Javascript允许您忽略您未使用的参数(即,您可以定义一个只接受一个参数的回调函数,即使它将被调用两个参数),通常,第一个参数是您最有可能的参数正在使用。 (实际上, this
变量通常是你最有可能使用的数据项,后跟第一个参数,等等)
根据https://learn.jquery.com/using-jquery-core/iterating/
一句警告:
$.map()
切换回调参数的顺序[与$().map
,$each()
和$().each()
]进行比较。 这样做是为了匹配ECMAScript 5中提供的本机JavaScript.map()
方法。
恕我直言, $.map
和$.grep
就像Ruby中的类方法一样,因为:
- 他们将目标数组作为第一个参数。
- 回调参数顺序与Ruby一致(
each_with_index
)
根据我的Ruby经验,这只是我个人的助记符。
其他方法有点jQuery遗留,并不容易“修复”,虽然我仍然希望有一个修复,因为它已经发生jQuery最新不是真的最新 ,所以什么是不可能的?