柯里化是把接收多个参数的函数变换成接收一个单一参数的函数, 并且返回一个新函数 , 这个新函数能够接收原函数的参数
function adder(num) {
return function(x) {
return num + x;
}
}
var add5 = adder(5)
console.log(add5(1) // 6
函数 adder() 接收一个参数 , 并返回一个函数 , 这个返回的函数可以像预期的那样被调用。 变量 add5 保持着 adder(5) 返回的函数 ,这个函数可以接收一个参数 , 并返回参数与5 的和。柯里化在 DOM 的回调中非常有用。
现在我们来写一个通用的curry函数
function add(x , y , z) {
return x + y + z;
}
var add_curry = curry(add);
add_curry(1)(2)(3)
function curry(fn) {
// 闭包
var args = []; // 接收数组
args = args.concat(Array.from(arguments).slice(1));
return function next() {
args = args.concat(Array.from(arguments));
if(args.length < fn.length) {
return next;// 重点
} else if(args.length === fn.length) {
fn.apply(this , args);
}
}
}
总结
- 函数柯里化实际上是把多个参数的函数, 转换为单个参数的函数
- 可以随着参数顺序调用函数, 是函数式编程的一种