JavaScript中的函数组合
在函数式编程中,函数组合是将多个函数组合成一个新函数的过程。这种技术在函数式编程中被广泛使用,但也可以在命令式编程中使用。它的主要优点是可读性、可重用性和模块化。
组合函数
创建一个compose()
函数相对简单,只要我们理解它应该如何工作。类似于数学,JavaScript中的函数组合是从右到左执行的。为了迭代这些函数,我们可以简单地使用Array.prototype.reduce()
,并将前一个函数的结果作为下一个函数的参数传递。第一个函数可以具有任意的参数个数,而剩余的函数必须是一元的(只有一个参数)。
const compose = (...fns) =>
fns.reduce((f, g) => (...args) => f(g(...args)));
const digitize = n => [...`${n}`].map(i => parseInt(i));
const add5 = x => x + 5;
const multiply = (x, y) => x * y;
const composedFn = compose(
digitize,
add5,
multiply
);
composedFn(5, 2); // [1, 5]
管道函数
如果从右到左的函数组合对你来说听起来不直观,你可以很容易地创建一个pipe()
函数,它执行从左到右的函数组合。实现方式与前面的函数几乎相同,只是我们需要反转函数的调用顺序。
const pipe = (...fns) =>
fns.reduce((f, g) => (...args) => g(f(...args)));
```javascript
const digitize = n => [...`${n}`].map(i => parseInt(i));
const add5 = x => x + 5;
const multiply = (x, y) => x * y;
const composedFn = pipe(multiply, add5, digitize);
composedFn(5, 2); // [1, 5]
const digitize = n => [...`${n}`].map(i => parseInt(i));
const add5 = x => x + 5;
const multiply = (x, y) => x * y;
const composedFn = pipe(multiply, add5, digitize);
composedFn(5, 2); // [1, 5]