博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
柯理化
阅读量:5127 次
发布时间:2019-06-13

本文共 1719 字,大约阅读时间需要 5 分钟。

在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

 

 

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

 

转载于:https://www.cnblogs.com/fyh123/p/5990020.html

你可能感兴趣的文章
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
人物角色群体攻击判定(一)
查看>>
一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
MySQL(一)
查看>>
企业级应用与互联网应用的区别
查看>>
Vue父子组件间的通信
查看>>
PHPCMS 模板的设置
查看>>
linux-2.6.38 input子系统(用输入子系统实现按键操作)
查看>>
单点登录 之 OAuth
查看>>