Оба метода, кажется, приводят к тем же результатам, но мне было трудно на самом деле убеждать людей, что второй метод работает, так как он не, по-видимому, обычно известен.
// Create some data
var foo = { 'vals':[ {'id':'foo'}, {'id':'bar'} ] };
// Common Method
$.each(foo.vals, function(i,o){
alert(this.id);
});
// Alternative (lesser-known?) Method
$(foo.vals).each(function(i,o){
alert(this.id);
});
После проверки источника эти два, кажется, one-in-the-same. Второй метод следует:
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
Этот метод очевидно называет более обычно известный метод, означая, что это столь же законно. Это понимает корректный, или я пропускаю что-то здесь?
Я обычно доверял этому методу, так как он не заставил меня отклоняться от общепринятой практики относительно селекторов. Давайте столкнемся с ним, мы обучены сделать:
$("p").each();
Таким образом, кажется только естественным сделать:
$(obj).each();
Действительно ли я ошибаюсь?
Разница между ними на самом деле экспоненциальная, в зависимости от того, как вы их используете.
Первый $.each
представляет собой единственный вызов функции для запуска итератора.
Второй $(foo.vals).each
делает три вызова функции для запуска итератора. Первый - $()
, который создает новый набор оберток jQuery (не уверен, сколько еще вызовов функций происходит во время этого процесса). Затем вызов $().each
. И, наконец, выполняется внутренний вызов jQuery.each
для запуска итератора.
В вашем примере разница будет, мягко говоря, незначительной. Однако во вложенном сценарии использования вы можете обнаружить, что производительность становится проблемой.
Наконец, Коди Линдли в книге jQuery Enlightenment не рекомендует использовать $.each
для итераций больше 1000 из-за вызовов функций. Используйте обычный for( var i = 0...
цикл.
Я не уверен, что все остальные говорят... но я почти исключительно использую ваш второй метод.
Будучи выходцем из страны .NET... для меня это просто имеет больше смысла и облегчает чтение.