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()
。
答案 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 });
可能不太清楚。