Каков предпочтительный способ объединения функций 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()
.
Ответы
Ответ 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 });
который, вероятно, менее ясен.