JS之函数柯里化 Currying

223 阅读1分钟
先概念脑补一下:

是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后,部分应用参数,并返回一个更具体的函数接受剩下的参数,中间可嵌套多层这样的接受部分参数函数,逐步缩小函数的适用范围,逐步求解,直至返回最后结果。

使用场景

1.固定不变的参数,实现参数复用 2.延迟执行,同样 bind 和箭头函数也能实现同样的功能。

举个简单例子
var foo = function(a) {
  return function(b) {
    return a * a + b * b;
  }
}

调用上述函数foo(3)(4)

举个我觉得复杂的例子- -
function add() {

    var _args = [];
    
    return function(){
        if(arguments.length === 0) { 
            return _args.reduce(function(a,b) {
                return a + b;
            });
        }
        [].push.apply(_args, [].slice.call(arguments));
        /*备忘录,老忘记apply和call区别,记住了吗?!!
        简单记录如下
        xxx.say.call(test,"1","2");
        xxx.say.apply(test,["1","2"]);
        */
        return arguments.callee;
        //callee 是 arguments 对象的一个属性。可用于引用该函数的函数体内当前正在执行的函数。
    }
}

var sum = add();
sum(2)(3)(4)(5)(); //14
一个通用的柯里化函数,自己琢磨一下
var curring = function(fn){
        var _args = [];
        return function cb(){

            if(arguments.length === 0) {
                return fn.apply(this, _args);
            }

            Array.prototype.push.apply(_args, [].slice.call(arguments));

            return cb;
        }


    }

var multi = function(){
        var total = 0;
        var argsArray = Array.prototype.slice.call(arguments);
        argsArray.forEach(function(item){
                total += item;
            })

        return total
};

var calc = curring(multi);

calc(1,2)(3)(4,5,6);

console.log(calc());
柯里化函数的作用

1.提高通用性 2 延迟执行 柯里化的另一个应用场景是延迟执行。不断的柯里化,累积传入的参数,最后执行。