函数柯里化
概念:
将原本需要接收所有参数的函数,转换成只接收部分参数的函数,并且返回一个新的函数,这个函数可以接收剩余的参数,并且返回最终结果
特性:
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中编译运行
在这个案例中,利用函数的柯里化来实现对网址协议部分的重复利用,实现参数复用,提高程序的复用性
这两个拼接的地址点击后可以访问到对应的网页