如何理解多个参数的函数组合?

时间:2015-02-04 04:57:33

标签: javascript functional-programming underscore.js lodash

如:

var foo = function (a, b) { return a + b; };
var bar = function (a, b) { return a * b; };

var fn = _.compose([foo, bar]);

如何理解fn

3 个答案:

答案 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是为列表中最后一个函数设计的,这些函数对单个参数进行操作,该参数是列表中先前函数的返回值。

实际实施显示它返回NaNhttp://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])

https://github.com/pdme/compound