柯理化

在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

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

时间: 2024-12-25 02:13:00

柯理化的相关文章

函数柯理化

通常创建柯理化函数的方式: function curry(fn){ var args = Array.prototype.slice.call(arguments, 1); return function(){ var innerArgs = Array.prototype.slice.call(arguments), finalArgs = args.concat(innerArgs); return fn.apply(null, finalArgs); }; } curry函数的主要任务是安

JS高阶编程技巧--柯理化函数

首先看一段代码: let obj = { x: 100 }; function fn(y) { this.x += y; console.log(this); } 现在有一个需求:在1秒后,执行函数fn,并让其this指向obj. 如果写成 setTimeout(fn, 1000); 这么写的话,fn函数中的this是指向window的,而且也没有传递参数. 如果写成 setTimeout(fn(200), 1000); 这么写的话,this指向依然是window,而且相当于立即执行fn函数,并

javascript中利用柯里化函数实现bind方法

柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预先存储的值进行相关的操作处理即可: 柯里化函数主要起到预处理的作用: bind方法的作用:把传递进来的callback回调方法中的this预先处理为上下文context; /** * bind方法实现原理1 * @param callback [Function] 回调函数 * @param con

珂理化函数

有个需求:过一秒后执行fn,传递一个数字100,让fn中的this变为obj,输出"柯理化函数100" var name = "window"; var obj = {name: "柯理化函数"}; function fn(e, num) { console.log(this.name + num); } 第一种思路,常规想法: window.setTimeout(fn, 1000);//->this window ->windowu

第一篇就献给自己学习javascript的一份笔记吧

javascript作为一种脚本语言可以放在html页面中任何位置,但是浏览器解释html时是按先后顺序的,所以前面的script就先被执行.比如进行页面显示初始化的js必须放在head里面,因为初始化都要求提前进行(如给页面body设置css等):而如果是通过事件调用执行的function那么对位置没什么要求的.单行注释,在注释内容前加符号 “//”多行注释以"/*"开始,以"*/"结束 js数据类型弱类型特性原始类型 number string boolean

蝴蝶书学习笔记

p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px ".PingFang SC"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helv

(转)现代C++函数式编程

本文转自:http://geek.csdn.net/news/detail/96636 现代C++函数式编程 C++ 函数式编程 pipeline 开发经验 柯里化 阅读2127 作者简介: 祁宇,武汉烽火云创软件技术有限公司研发中心技术总监,<深入应用C++11>作者,C++开源社区purecpp.org创始人,致力于C++11的应用.研究和推广.乐于研究和分享技术,爱好C++,爱好开源. 导读: 本文作者从介绍函数式编程的概念入手,分析了函数式编程的表现形式和特性,最终通过现代C++的新特

scala函数进阶篇

1.求值策略scala里有两种求值策略Call By Value -先对函数实参求值,在函数体中用这个求出的参数值.Call By Name -先不对函数实参求值,而是函数实参每次在函数体内被用到时都会求值.scala通常使用Call By Value 如果函数形参类型以 =>开头,那么就是在使用Call By Namedef foo(x : Int)= x         //Call By Valuedef foo(x : => Int)= x   //Call By Name def l

高阶组件

前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只不过传入的参数变成了react组件,并返回一个新的组件. A higher-order component is a function that takes a component and returns a new component. 形如: const EnhancedComponent = higherOrderComp