首先简单介绍一下什么是“函数柯里化”,在《javascript高级程序设计》这本书中有如下介绍:
与函数绑定紧密相关的主题是函数柯里化,它用于创建已经设置好的一个或者多个参数的函数。函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。
我们来通俗易懂的理解一下,既然是“函数柯里化”,我们首先得需要一个函数,然后再来想办法来“柯里化”它,所以我们先创建一个简单的函数add
function add(num1,num2){
return num1 + num2;
}
复制代码
柯里化的目标是:创建已经设置好的一个或者多个参数的函数,所以接下来创建一个函数,这个函数需要使用闭包返回一个已经设置好的一个或者多个参数的函数,取名curry
function curry(fn){
return function(){
}
}
复制代码
此时的curry函数将用于“柯里化”我们刚刚创建的函数add,所以add函数将作为参数传入curry中
接下来,我们来继续完成curry函数,既然要固定一个或者多个参数,那么该参数需随add函数一起传入curry中,由于固定的可以是一个或者多个,所以我们运用数组的slice方法把它从参数列表中截取出来
function curry(fn){
var args = Array.slice.call(arguments,1);//第0位为fn,从第1位开始获取后面所有参数
return function(){
}
}
复制代码
固定的参数截取出来后,再获取传入参数,合并参数,传入给add,返回add函数执行的结果
function curry(fn){
var args = Array.prototype.slice.call(arguments,1);//第0位为fn,从第1位开始获取后面所有参数
return function(){
var innerArgs = Array.prototype.slice.call(arguments);//获取后传入的参数
var finalArgs = args.concat(innerArgs);//合并
return fn.apply(null,finalArgs);
}
}
复制代码
假设此时固定add方法第一个参数为数字5
var curridAdd = curry(add,5)
此时的curridAdd即为柯里化后的函数
curridAdd(2) //固定参数为5,传入参数为2,结果为7
也可以固定2个参数
var curridAdd = curry(add,5,1)
curridAdd(2) //固定参数为5和1,无论传入参数为多少,结果为6
至此一个简单的柯里化函数curry实现了