Каков предпочтительный способ объединения функций Underscore.js? - PullRequest
25 голосов
/ 09 марта 2012

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().

Ответы [ 2 ]

32 голосов
/ 01 апреля 2012

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

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

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

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

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

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

0 голосов
/ 09 марта 2012

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

Различие, которое она делает помимо стиля, состоит в том, что использование стиля OOP (или стиля объекта в вашем определении) состоит в том, что он создает цепочечные обернутые объекты.Так что это легко сделать:

_([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 });

, что, вероятно, менее понятно.

...