柯里化是把一个多参数函数转换为一个嵌套的一元函数的过程。
先看个简单的例子,这是一个名为 add 的函数:
const add = (x, y) => x + y;
调用该函数 add(1, 1)、add(1, 2)、add(1, 3)…很普通,缺乏灵活性。
下面是柯里化实现版本:
const addCurried = x => y => x + y;
如果我们用一个单一的参数调用 addCurried,
const add1 = addCurried(1)
它返回一个函数fn = y => 1 + y
,在其中 x 值通过闭包缓存下来。
接下来,我们继续传参add1(1); add1(2); add1(3),有没有感觉比上面的 add 灵活。
那么柯里化是怎样实现的呢?先传入一个接受二元函数,然后返回一个一元函数,当这个一元函数执行后,再返回一个一元函数,再次执行返回的一元函数时,触发最开始那个二元函数的执行。
// 柯里化函数参数任意数量
const curry = (fn) => {
if (typeof fn !== 'function') {
throw Error('No function provided')
}
return function curriedFn (...args) {
if (fn.length > args.length) { // 未达到触发条件,继续收集参数
return function () {
return curriedFn.apply(null, args.concat([].slice.call(arguments)))
}
}
return fn.apply(null, args)
}
}
const multiply = (x, y, z) => x*y*z;
const curryMul = curry(multiply);
const result = curryMul(1)(2)(3); // 1*2*3 = 6