Почему аргументы обратного вызова jQuery несовместимы?

Общий шаблон в 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 теперь установлен, но для меня это похоже на грубую несогласованность.

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

Ответ 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 - это то, что вы хотите.

Ответ 2

Это и разочаровывало меня - временами - $.each, который я всегда испортил.

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

Я не думаю, что это будет исправлено - по крайней мере, мое мнение/отношение. Я просто собираюсь посвятить их памяти и надеяться на лучшее!

Ответ 3

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

Ответ 4

IMHO, $.map и $.grep ведут себя как методы класса в Ruby, потому что:

  • они принимают целевой массив в качестве первого аргумента.
  • порядок аргументов обратного вызова согласуется с Ruby (each_with_index)

Это моя личная мнемоника за мой опыт в Ruby.

Другие методы - это своеобразное jQuery-наследие и нелегкое "исправление", хотя я все еще хочу, чтобы там было исправление, потому что уже случилось, что jQuery last is not действительно ПОСЛЕДНИЕ, так что не возможно?

Ответ 5

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

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