柯里化
柯里化(Currying)是一种将接受多个参数的函数转换为一系列接受单个参数的函数的技术。
柯里化不会调用函数。它只是对函数进行转换。
简单来说,柯里化是一种函数的转换,原本一个函数需要一次性接收多个参数才能执行,通过柯里化,将其改造成可以逐步接收参数,并在接收完所有必要参数后才执行最终的操作。
比如将一个函数从可调用的 f(a, b)
转换为可调用的 f(a)(b)
。
创建一个辅助函数 curry(func)
,该函数将对两个参数的函数 sum
执行柯里化。换句话说,对于两个参数的函数 sum(a, b)
执行 curry(func)
会将其转换为以 sum(a)(b)
形式运行的函数:
// 非柯里化的写法
function sum(a, b) {
return a + b;
}
// 将函数sum 进行 柯里化 转换
function curry(func) {
return function(a) {
return function(b) {
return func(a, b);
};
};
}
// 具体使用
let curriedSum = curry(sum);
console.log(curriedSum(1)(2)); // 3
实现原理:
curry(func)
的结果就是一个包装器function(a)
。- 当它被像
curriedSum(1)
这样调用时,它的参数会被保存在词法环境中,然后返回一个新的包装器function(b)
。 - 然后这个包装器被以
(2)
为参数调用,并且,它将该调用传递给原始的sum
函数。
柯里化更高级的实现,例如 lodash 库的 _.curry,会返回一个包装器,该包装器允许函数被正常调用或者以部分应用函数(partial)的方式调用:
function sum(a, b) {
return a + b;
}</