Эти две функции, _.forEach
и $.each
, взятые соответственно из underscore
и jQuery
, похоже, делают одно и то же.
Каковы возможные причины предпочесть одну реализацию другому?
Эти две функции, _.forEach
и $.each
, взятые соответственно из underscore
и jQuery
, похоже, делают одно и то же.
Каковы возможные причины предпочесть одну реализацию другому?
_.forEach
и $.each
отличается для аргументов, переданных обратному вызову.
Если вы используете _.forEach
, первым аргументом, переданным обратному вызову, является значение, а не ключ.
Поэтому, если вы вообще не беспокоитесь о ключе, вы должны использовать _.forEach
.
Другие отличия:
_.forEach
он будет немного быстрее, так как он использует собственный Arrray.prototype.forEach
в современных браузерах.Оба они в основном обеспечивают замену функции forEach, которая недоступна в IE8.
Они не добавляют много, если вы повторяете массивы.
Основное отличие, помимо порядка аргументов обратного вызова, заключается в том, что в jQuery значение также доступно как контекст вызова обратного вызова (поэтому значение, менее важно, является только вторым аргументом). На самом деле это не главная причина, чтобы предпочесть его, если вам не нравится избегать передачи аргумента функции:
var product = 1;
$.each([1, 2, 3], function(){ product *= this });
Чаще всего вы не используете обе библиотеки, поэтому просто используете функцию итерации, предоставляемую библиотекой.
Если вам нужно импортировать обе библиотеки, я бы предложил использовать функцию подчеркивания как
...
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
...
jQuery выглядит следующим образом:
something.each( function(index, Element) )
Подчеркивание выглядит следующим образом:
_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])
Нативный массив. для каждого выглядит следующим образом:
array.forEach(function(Element, index, list), [context])
Итак:
forEach
this
в Element
, native и Underscore позволяют вам предоставлять свой собственный контекст.Изменить: Почему полезно устанавливать контекст?
Учтите, что у вас есть какой-то объект:
var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
Предположим, вы хотите вызвать этот метод для каждого значения из массива.
Используя параметр контекста, вы можете просто сказать:
myArray.forEach(worker.process, worker);
в то время как без него вам нужно быть более подробным (и сделать еще один вызов функции для каждого элемента):
// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );
Это одна из ситуаций, когда соглашение JQuery foreaching делает вещи менее удобными.