函数式编程的一部分内容
简单例子,先感受一下, 从右向左依次执行
// 返回一个函数, 执行顺序为从右向左, 第一个函数返回的结果为,下一个函数的参数
function compose (f, g) {
return function (data) {
return f(g(data))
}
}
function toUpperCase (str) {
return str.toUpperCase();
}
function add (str) {
return str + "!"
}
let f = compose(toUpperCase,add);
console.log(f("time"));
兼容一般情况的封装
function compose () {
var args = [].slice.call(arguments);
var len = args.length - 1;
return function (data) {
var result = args[len](data);
while (len--){
result = args[len](result);
}
return result
}
}
测试
function toUpperCase (str) {
return str.toUpperCase();
}
function add (str) {
return str + "!"
}
function split (str) {
return str.split("");
}
function reverse (arr) {
return arr.reverse();
}
function join (arr) {
return arr.join("=");
}
let f = compose(join,reverse,split,toUpperCase,add);
console.log(f("time"));/!=E=M=I=T
用reduceright优化
function compose () {
var args = [].slice.call(arguments);
return function (data) {
return args.reduceRight(function (res, cb) {
return cb(res);
},data)
}
}
用es6优化
const compos1e = (...args) => (data) => args.reduceRight((res,cb) => cb(res), data);
也可以改变方向, 从左向右传递,执行,
不过一般称为管道, pipe
const pipe = (...args) => (data) => args.reduce((res,cb) => cb(res), data);
网友评论