链接Underscore.js函数的首选方法是什么?

时间:2012-03-08 23:10:32

标签: javascript coding-style 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()

2 个答案:

答案 0 :(得分:32)

@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,我猜它只是一种风格偏好。我打开了issue at GitHub进行澄清。

答案 1 :(得分:0)

_用作函数时,它基本上包装了参数。包装器提供所有普通下划线函数。

它与样式的区别在于,使用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 });

可能不太清楚。