Почему аргументы обратного вызова jQuery несовместимы? - PullRequest
25 голосов
/ 31 августа 2010

Общий шаблон в jQuery - это метод, который принимает обратный вызов, которому передается элемент массива и его индекс в этом массиве. Тем не менее, кажется совершенно случайным, какой аргумент приходит первым. Например, из документов jQuery на http://api.jquery.com:

  • 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-интерфейс уже установлен, но мне кажется, что это является серьезным несоответствием.

Есть шаблон, который я пропускаю или это просто случайность? Должно ли это быть исправлено, или я должен просто заткнуться и запомнить их?

Ответы [ 4 ]

8 голосов
/ 31 августа 2010

Это не совсем случайно.Потому что:

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

Смотрите шаблон?Во втором примере есть второй аргумент, но он передается только для удобства и совпадает с this.

Шаблон заключается в том, что первый аргумент всегда «более» важен, чем второй, а последний аргумент должен быть наименее важным («более необязательный»).Таким образом, вам не нужно указывать все наименее важные аргументы, если вам нужен только один.А в случае $(...).each часто вам даже не нужны никакие аргументы, потому что this - это только то, что вы хотите.

7 голосов
/ 31 августа 2010

Меня это тоже иногда расстраивает - $.each - это то, что я всегда путаю.

Я думаю, это связано с тем, что разные люди / команды работают над разными частями фреймворка.Это фреймворк, управляемый сообществом, поэтому никто, вероятно, не поймал его на раннем этапе, и теперь, когда фреймворк настолько распространен, они не могут его исправить, не взломав 35% всех сайтов в Интернете.не думаю, что это будет исправлено - по крайней мере, это мое мнение / отношение.Мне просто нужно передать их в память и надеяться на лучшее!

2 голосов
/ 31 августа 2010

Поскольку Javascript позволяет игнорировать параметры, которые вы не используете (то есть вы можете определить функцию обратного вызова, которая принимает только один параметр, даже если он будет вызываться с двумя), как правило, первый параметр - это тот, который вы используетев основном, вероятно, будет использовать.(На самом деле, переменная this обычно представляет собой элемент данных, который вы, скорее всего, будете использовать, за которым следует первый параметр и т. Д.)

1 голос
/ 17 ноября 2016

Согласно https://learn.jquery.com/using-jquery-core/iterating/

Слово предупреждения: $.map() переключает порядок аргументов обратного вызова [по сравнению с $().map, $each() и $().each()]. Это было сделано для того, чтобы соответствовать нативному методу JavaScript .map() доступно в ECMAScript 5.

...