函数式编程01之纯函数、函数组合或饲养函数、结合律

1.什么是纯函数

概念:相同的输入得到相同的输出,不依赖且不影响外部环境也不产生任何副作用。

优点:易读/易维护。

代码

不是纯函数:
var a = 1;
function test() {
  console.log(a); // 当a的值被改变后,下次在执行test()会得到不同的结果
}
test()
纯函数:
var a = 1;
function test(num) {
  console.log(num);
}
test(a);

2.函数组合或饲养函数

概念:由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,并实现一种有序执行的效果。(注意:函数组合是为了组合函数,不是为了传递参数)

代码

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'))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值