函数式编程01之纯函数、函数组合或饲养函数、结合律
2020-07-17 本文已影响0人
LuoDada
- 什么是纯函数
概念:相同的输入得到相同的输出,不依赖且不影响外部环境也不产生任何副作用。
优点:易读/易维护。
代码:
不是纯函数:
var a = 1;
function test() {
console.log(a); // 当a的值被改变后,下次在执行test()会得到不同的结果
}
test()
纯函数:
var a = 1;
function test(num) {
console.log(num);
}
test(a);
- 函数组合或饲养函数
概念:由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,并实现一种有序执行的效果。(注意:函数组合是为了组合函数,不是为了传递参数)
代码:
function toUpperCase(str) {
return str.toUpperCase();
}
function exclaim(str) {
return str + '!';
}
function split(str) {
return str.split('')
}
function compose() {
var args = Array.prototype.slice.call(arguments);
return function(x) {
// prev必需。初始值, 或者计算结束后的返回值。
// cur必需。当前元素
// x 可选。传递给函数的初始值
// return args.reduce(function(res, cb) { // 从左往右执行
// 从右往左执行
return args.reduceRight(function(res, cb) {
return cb(res)
}, x)
}
}
var f = compose(split, toUpperCase, exclaim);
console.log(f('hello'))
3.结合律
概念:在组合函数的参数中,再进行函数的分组组合和原来的分组组合得出来的结论是一摸一样的。
代码:
function toUpperCase(str) {
return str.toUpperCase();
}
function exclaim(str) {
return str + '!';
}
function split(str) {
return str.split('')
}
function compose() {
var args = Array.prototype.slice.call(arguments);
return function(x) {
// prev必需。初始值, 或者计算结束后的返回值。
// cur必需。当前元素
// x 可选。传递给函数的初始值
return args.reduceRight(function(res, cb) {
return cb(res)
}, x)
}
}
var f = compose(split, toUpperCase, exclaim);
var f1 = compose(compose(split, toUpperCase), exclaim);
var f2 = compose(split, compose(toUpperCase, exclaim));
console.log(f('hello'))
console.log(f1('hello'))
console.log(f2('hello'))