柯理化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了柯理化相关的知识,希望对你有一定的参考价值。

在JS中柯里化就是把一个需要传入多个参数的函数变成多个嵌套的只要传入一个参数的函数

在普通函数中的柯理化:

var add=function(x,y){

 return x+y;

}

柯里化:

var addCurring=function(x){

 return function(y){

  return x+y;

}

}

 

addCurring(1)(2);//3

 

如果是多个参数就会有多层嵌套,相当于把一个函数拆分成多个部分,通过组合得到完整的函数,其实柯里化和前端框架的组件思想相同,都是模块化思想。

 

来一个四个参数的例子:

 

var add=function(a,b,c,d){

  console.log(a+b+c+d);

}

柯里化后:

var addCurring=function(a){

return function(b){

return function(c){

return function(d){

console.log(a+b+c+d);//这里写的是逻辑代码,我这里用打印代替

}

}

}

}

var addCurring1=addCurring(1);

var addCurring2=addCurring1(2);

var addCurring3=addCurring2(3);

var addCurring4=addCurring3(4);// 10

如果前面几个参数都是固定的情况可以这样解决:

var addCurring=addCurring(1)(2)(3);

//只需要传入最后一个参数即可

addCurring(4);//10

addCurring(5);//11

addCurring(6);//12

 

高阶函数中:

var currying = function(fn) {

            //这里保存每次的开销

            var args = [];

            return function() {

                //如果传入的参数长度为0,也就是没有传参的情况下,其实就是告诉程序,我要/求总开销了

                if (arguments.length === 0) {

                    //将fn在这块上下文中执行,并且把每天的开销当做参数传入

                    return fn.apply(this, args);

 

                //有参数传入的话,就说明还在记录每天的开销,并没有要/求总开销

                } else {

                    //arguments请自行google,它是一个对象并不是一个数组。

                    //将arguments转为数组后push到args

                    //也就是收到每天的开销后,保存到args中

                    [].push.apply(args, arguments);

                    //把这块上下文再次return出去

                    return arguments.callee;

                }

            }

        };

        var cost = (function() {

            //典型的闭包,将money保存起来

            var money = 0;

            //这里就是currying(fn)中的fn

            return function() {

                //arguments其实就是currying中的args

                //收到了求总开销的命令,下面是真正计算总开销的地方

                for (var i = 0, l = arguments.length; i < l; i++) {

                    money += arguments[i];

                }

                return money;

            }

        })();

        var cost = currying(cost); // 转化成currying 函数

        cost(100); // 未真正求值

        cost(200); // 未真正求值

        cost(300); // 未真正求值

        cost(200); // 未真正求值

        cost(200); // 未真正求值

        cost(50); // 未真正求值

        cost(100); // 未真正求值

        alert(cost()); // 求值并输出:600

 

 

总而言之,柯里化就是使用了功能化的思想来处理函数多个参数的情况,从而提高代码的可阅读性以及可维护性

 

以上是关于柯理化的主要内容,如果未能解决你的问题,请参考以下文章

scala 函数(柯理化)

柯理化函数编程思想

JS`柯理化`

函数柯理化-延迟运行

函数柯理化之参数复用

柯理化函数-初步封装