函数柯里化

函数柯里化


概念将原本需要接收所有参数的函数,转换成只接收部分参数的函数,并且返回一个新的函数,这个函数可以接收剩余的参数,并且返回最终结果

特性
1. 参数的延迟调用
2. 参数的复用性

为了便于理解函数柯里化的概念和特性,通过两个案例来加深理解

  • 利用函数柯里化实现任意个数字的相加
    代码实现:
function currySum(){
	let args = [...arguments ]
	let inner = function () {
		console.log(arguments)
		//判断arguments的长度是否等于0
		if(arguments.length === 0){
			//等于0表示没有实参在传进来,进行求和计算
			return args.reduce((pre,cur)=> pre + cur)
		} else {
			//不等于0表示还有实参传进来,把传进来的实参追加到数组中
			args.push(...arguments)
			return inner
		}
		return inner
	}
	return inner
}

//调用传参并把结果打印到控制台
console.log(currySum(1)(2));
//这里的空括号表示递归的出口,当递归执行到空的小括号就应该结束,并返回最终的累加结果,那么会有一个问题,如何判断已经执行到空的小括号呢?
//空的小括号表示没有传递实参,arguments的长度就是0,所以只要判断是否arguments的长度是否等于0即可
console.log(currySum(1)(2)(3)());
console.log(currySum(1)(2)(3)(4)());
console.log(currySum(1)(2)(3)(4)(5)());

在VSCode中编译运行
在这里插入图片描述
可以看到在arguments的长度等于0时,进行相加求和计算

因为不知道要接收多少个实参,所以使用普通函数解决不了这个问题,使用函数柯里化的思想,把要接收所有参数的currySum()函数转换成只接收部分参数的函数,并且返回一个新的函数inner,用这个函数来接收剩余的参数,并且返回求和计算后的结果
通过这个案例可以很好的理解函数柯里化的特性参数的延迟调用


利用函数柯里化来实现参数的复用
代码实现:

function curryUrl(protocol){
	return function (hostname,path){
		return `${protocol}${hostname}${path}`
	}
}
//相同部分的参数被多次使用,大大提高了参数的复用性
let url = curryUrl('https://')

console.log(url('www.baidu.com/','index.html'))
console.log(url('www.sina.com/','news.html'))

在VScode中编译运行
在这里插入图片描述
在这个案例中,利用函数的柯里化来实现对网址协议部分的重复利用,实现参数复用,提高程序的复用性
这两个拼接的地址点击后可以访问到对应的网页

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值