首先看一下函数柯里化的定义: 函数柯里化指的是一个转化过程,在这个过程中,把一个接受多个参数的函数,转化成一个个嵌套的函数,这些嵌套的函数只接受一个参数。举一个简单的例子体验一下, 我们写一个add 函数,它接受两个参数,然后返回参数的和。
const add = (x,y) => x + y;
简单调用,add(2, 3) 返回5,没有什么可说了。 现在我们把这个函数进行柯里化。柯里化,每一个函数只接受一个参数,所以我们要先声明一个函数,它接受一个参数,假设x,
function addCurried(x){
}
由于add 接受两个参数,所以还剩一个参数y, 只有函数才能接受参数, 所以addCurried 还要返回一个函数接受参数 y.
function addCurried (x) { return function(y) { } }
这时两个参数都获取到了,就可以进行计算了。所以可以在返回的函数中直接写return x + y;
function addCurried (x) { return function(y) { return x + y; } }
现在我们就完成了函数add的柯里化。一个函数接受两个参数,变成了两个嵌套函数,每一函数都只接受一个参数。柯里化完成后,函数的调用也发生了变化,一次调用只返回一个函数,
let fn = addCurried(2);
console.log(fn)
所以还要调用一次
let result = fn(3);
console.log(result);
简化方式的调用
let result = addCurried(2)(3);
console.log(result);
现在我们一步一步地把add函数进行了柯里化,如果把这个过程进行封装,那么就可以对任意接受两个参数的函数进行柯里化。我们把这个函数命名为curry,它首先接受一个实行柯里化函数作为参数,然后再返回我们上面的addCurried函数
function curry(fn) { return function addCurried(x) { return function(y) { return fn(x, y) } } }