Подтвердить что ты не робот

Каков предпочтительный способ объединения функций Underscore.js?

Underscore.js имеет два способа вызова функций, которые я буду называть объектными и функциональными. Объектный стиль выглядит следующим образом:

_(myObject).each(function (val, key) {
  console.log(key, val);
});

Функциональный стиль, с другой стороны, выглядит следующим образом:

_.each(myObject, function (val, key) {
  console.log(key, val);
});

Я с радостью использовал вызовы в стиле объектов в моем коде, но в какой-то момент стиль объекта вызова исчез из документации underscore.js(хотя вызовы в стиле объектов все еще работают отлично). Я также видел подсказки вокруг места (например, в документации backbone.js), что стиль функции "лучше" или "предпочтительнее".

Итак, является ли стиль функции предпочтительным методом? И если да, может кто-нибудь объяснить причины этого?

Обновление: @ggozad частично ответил на мой вопрос. Но, похоже, мое понимание того, как работают underscore.js, было обращено назад к версии 0.4.2. Прочитав историю изменений для underscore.js, вы можете увидеть эту запись для версии 1.2.4:

Теперь вы можете (и, вероятно, должны) написать _.chain(list) вместо _(list).chain().

Я хотел бы знать, почему вы должны писать _.chain(list) вместо _(list).chain().

4b9b3361

Ответ 1

Ответ @ggozad на самом деле очень вводит в заблуждение. Объектно-ориентированный стиль не имеет ничего общего с цепочкой. Приведенный пример:

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});

на самом деле не использует цепочку подчеркивания вообще! Он работает только потому, что встроенный объект массива JS имеет свою собственную функцию map(). Попробуйте функцию, не встроенную (например, перетасовку), и вы увидите, что она разбивается:

_([1,2,3]).shuffle().shuffle();

Единственный способ получить цепочку подчеркивания - вызвать chain(), который вы можете использовать, используя либо стиль (OO, либо функциональный).

Что касается того, почему в документации говорится, что вы должны использовать _.chain, я предполагаю, что это только предпочтение стиля. Я раскрыл вопрос в GitHub для уточнения.

Ответ 2

Когда _ используется как функция, он по существу обертывает аргумент. Обертка предоставляет все обычные функции подчеркивания.

Различие, которое он отличает от стиля, заключается в том, что использование стиля ООП (или стиля объекта в вашем определении) заключается в том, что он создает цепочки с завербованными объектами. Это легко сделать:

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});

Эквивалент:

_.map(_.map([1,2,3], function (item) { return item * 2 }), function (item) { return item * 3 });

который, вероятно, менее ясен.