2010-08-31 3 views
24

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

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

+2

Ницца! Таким образом, функции массива PHP не являются единственными с непоследовательным упорядочением параметров. –

ответ

8

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

$.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

То же самое с селекторами и контекстом. $ (myselector, mycontext) является необязательным, поэтому он второй. –

+0

@Mark Schultheiss, точно. –

+0

Делает смысл - хороший момент! Я начинал раздражаться, но теперь, если я подумаю об этом, я, вероятно, смогу вспомнить! – Jason

2

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

7

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

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

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

0

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

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

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

Другие методы являются своеобразным jQuery-наследием и нелегко «исправить», хотя я все еще хочу, чтобы было исправлено, потому что уже было так, что jQuery latest is not really LATEST, так что не возможно?

0

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

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

Смежные вопросы