Почему аргументы обратного вызова 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.