如:
var foo = function (a, b) { return a + b; };
var bar = function (a, b) { return a * b; };
var fn = _.compose([foo, bar]);
如何理解fn
?
答案 0 :(得分:6)
这不起作用。
首先,_.compose()
不接受数组。它将函数列表作为单独的参数,如:
var fn = _.compose(foo, bar);
然后,即使以这种方式完成,使用下划线的_.compose()
,每个连续的函数都会传递前一个函数的返回结果。由于你的两个函数都需要两个参数并返回一个,所以这不起作用。
如果您修改代码以将参数正确传递给_.compose()
,那么您将拥有以下内容:
var foo = function (a, b) { return a + b; };
var bar = function (a, b) { return a * b; };
var fn = _.compose(foo, bar);
然后如果您使用fn
这样:
fn(2, 5);
它会尝试执行:
foo(bar(2, 5));
将这一点分开,bar(2, 5)
将返回10
,因此您将获得调用foo(10)
的结果,但会生成NaN
因为foo()
的第二个参数1}}是undefined
。
_.compose
是为列表中最后一个函数设计的,这些函数对单个参数进行操作,该参数是列表中先前函数的返回值。
实际实施显示它返回NaN
:http://jsfiddle.net/jfriend00/xhbcdh9k/
答案 1 :(得分:0)
compose
函数接受多个函数并返回单个函数。所以你可以这样称呼它:var fn = compose(foo, bar);
您可以将fn
视为仅调用bar
然后调用foo
的结果。例如bar(foo());
您的功能不会撰写,因为foo
需要2个参数foo(a, b)
,但bar
会返回1个值。
I wrote about compose, maybe it can help you understand it better.
答案 2 :(得分:0)
[无耻的自我推销]
我写了一个小帮手函数,其行为类似于compose,但也传递了其余的参数:
const compound = (...fns) => (...args) =>
fns
.reverse()
.reduce((result, fn) => fn(...[result, ...args.slice(1)]), args[0])