# 组合函数
到了第四章了,函数式编程的魅力似乎越来越大。
对于函数式编程者,他们会将每个函数都当成是一个“部件”,在需要时通过组装不同的“部件”,来拼凑出一个自己想要的“模型”。
专业点的角度来说,就是我们能够定义某种组合方式,来让它们成为一种新的组合函数,程序中不同的部分都可以使用这个函数。这种将函数一起使用的过程叫做组合。
再介绍组合函数的概念之前,我们就已经使用过组合了。
例如在之前我们的一个案例:
unary(adder(3))
@前端进阶之旅: 代码已经复制到剪贴板
上面的表达式,我们将两个函数整合起来,然后将第一个函数调用产生的值(输出)当成第二个函数调用的实参(输入)。画个简图,也就是这样:
functionValue <-- unary <-- adder <-- 3
@前端进阶之旅: 代码已经复制到剪贴板
3 是 adder(..) 的输入。而 adder(..) 的输出是 unary(..) 的输入。unary(..) 的输出是 functionValue。 这就是 unary(..) 和 adder(..) 的组合。
# Compose2函数
为了满足上面组合函数的要求,我们可以来构造这么一个简单的函数:
function compose2(fn2,fn1) {
return function composed(origValue){
return fn2( fn1( origValue ) );
};
}
// ES6 箭头函数形式写法
var compose2 =
(fn2,fn1) =>
origValue =>
fn2( fn1( origValue ) );
@前端进阶之旅: 代码已经复制到剪贴板
它能够自动创建两个函数的组合,这和我们手动做的是一模一样的。
# Words案例
现在有这么一个需求,需要将给定的一个英文字符串,提取其中全部的英文单词,先全部转化小写,然后去除其中重复的单词。
我们可以先来创建这么2个函数:
function words(str) {
return String( str )
.toLowerCase()
.split( /\s|\b/ )
.filter( function alpha(v){
return /^[\w]+$/.test( v );
} );
}
function unique(list) {
var uniqList = [];
for (let i = 0; i < list.