# 函数科里化

# 定义

科里化是一种函数的转换。我们可以将函数调用转成一个参数一个参数的调用。

foo(a, b, c); 
转换后
foo(a)(b)(c);

# 为什么需要科里化

其实函数科里化和偏函数还有一些联系的,我们知道我们可以创建偏函数来创建出更偏向业务应用的函数。函数科里化允许我们更加灵活的创建偏函数。我们可以灵活的控制参数。参数复用。降低通用性,提供适用性。

# 实现

function curry(func) {
    return function curried(...args) {
        if (args.length >= func.length) {
            return func.apply(this, args);
        } else {
            return function (...moreArgs) {
                return curried.apply(this, args.concat(moreArgs));
            } 
        }
    }
}
function sum(a, b, c) {
  return a + b + c;
}

let currycs = curry(sum);

console.log( currycs(1, 2, 3) ); // 6,仍然可以被正常调用
console.log( currycs(1)(2,3) ); // 6,对第一个参数的柯里化
console.log( currycs(1)(2)(3) ); // 6,全柯里化

如果传入参数的个数不足,则返回偏函数.

实现思路就是:我们先包装一个新的函数,以这个新建立对函数判断,如果传入的参数和应接受的参数比较,如果不够就接着返回一个新的函数,然后把上一次的函数的参数和这个的参数累加继续调用判断是否参数够了,如果够了就调用这个函数. 如果本身就没有传够,那么就最终会返回一个偏函数。