柯里化

192 阅读1分钟

柯里化是把接收多个参数的函数变换成接收一个单一参数的函数, 并且返回一个新函数 , 这个新函数能够接收原函数的参数

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);
        }
    }
}

总结

  • 函数柯里化实际上是把多个参数的函数, 转换为单个参数的函数
  • 可以随着参数顺序调用函数, 是函数式编程的一种