柯里化2

重要参考:https://github.com/mqyqingfeng/Blog/issues/42

用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数,有没有毛病

第一版

var curry = function (fn) {
    // arguments[0]是fn, 这里是收集更多的参数
    // 注意,arguments是array-like object,所以要用array的方法
    var args = [].slice.call(arguments, 1);
    return function() {
        // 合并所有参数
        var newArgs = args.concat([].slice.call(arguments));
        return fn.apply(this, newArgs);
    };
};


//应用
function add(a, b) {
    return a + b;
}

var addCurry = curry(add, 1, 2);
addCurry() // 3
//或者
var addCurry = curry(add, 1);
addCurry(2) // 3
//或者
var addCurry = curry(add);
addCurry(1, 2) // 3

第二版

更易懂的实现

超简洁写法

参数不满足长度要求时,返回的函数仍需使用rest parameter:(...arg) => judge(...args, ...arg),否则除了第一次可以传递多个参数,后面只能一个一个传到足够为止了,不能直接处理fn(1,2)(3,4,5)的情况。

超超简洁写法

最后更新于

这有帮助吗?