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

Hor*_*aan 25 javascript coding-style underscore.js

Underscore.js有两种调用函数的方法,我将其称为对象样式和函数样式.对象样式如下所示:

_(myObject).each(function (val, key) {
  console.log(key, val);
});
Run Code Online (Sandbox Code Playgroud)

另一方面,函数式看起来像这样:

_.each(myObject, function (val, key) {
  console.log(key, val);
});
Run Code Online (Sandbox Code Playgroud)

我很高兴在我的代码中使用对象样式调用,但是在某些时候,调用的对象样式从underscore.js文档中消失了(虽然对象样式调用仍然可以正常工作).我还看到了这个地方的提示(比如在backbone.js文档中),功能风格是"更好"或"首选".

那么,函数式调用是首选方法吗?如果是这样,有人可以解释这背后的原因吗?

更新: @ggozad部分回答了我的问题.但似乎我对underscore.js如何工作的理解是围绕版本0.4.2形成的.通过阅读underscore.js的更改历史记录,您可以看到1.2.4版本的此条目:

你现在可以(也可能应该)写_.chain(list)而不是_(list).chain().

我想知道你为什么要写_.chain(list)而不是_(list).chain().

Rus*_*vis 32

@ggozad的回答实际上是非常误导的.面向对象的风格与链接无关.给出的例子:

_([1,2,3]).map(function (item) { return item * 2; }).map(function (item) { return item*3;});
Run Code Online (Sandbox Code Playgroud)

实际上根本没有使用下划线链接!它只能工作,因为内置的JS数组对象有自己的map()函数.尝试一个不是内置的功能(如shuffle),你会看到它中断:

_([1,2,3]).shuffle().shuffle();
Run Code Online (Sandbox Code Playgroud)

获得下划线链接的唯一方法是调用chain(),您可以使用任一样式(OO或函数)进行调用.

至于文档说你应该使用的原因_.chain,我猜它只是一种风格偏好.我在GitHub上打开了一个问题进行澄清.

  • 是的,_()不会在下划线中链接,但它确实链接在lodash中. (2认同)