JAVAScript柯里化、部分应用参数终极理解
一、柯里化
在定义柯里化、部分应用参数的概念前,首先必须对闭包有深入的了解和定义,闭包一句话说清楚:函数返回值为函数。
柯里化的定义:将多参函数分解为按步骤接受单个参数的函数,如下代码:
var mod = function(a,b){
return a * b;
}
function curry2(fun){
var _funTwo = function(arg){
return function(two){
return fun(arg,two);
}
};
return _funTwo;
}
var _add2 = curry2(mod);
var result2 = _add2(1)(2);
mod:接受两个参数,分别为a,b;
curry2:实现柯里化功能函数,由于传入mod这个参数,返回接受一个参数的闭包;在新闭包的函数上传入另一个值(b)即可完成mod函数的执行。
无限级柯里化
var mod = function(a,b){
return a * b;
}
function curry2(fun){
var newVal;
var _funTwo = function(arg){
return function(two){
if(!two) return newVal;
newVal = fun(arg,two);
return _funTwo(newVal);
}
};
return _funTwo;
}
var _add2 = curry2(mod);
var result2 = _add2(1)(2)(3)(4)(5)();
1.2、柯里化的应用
a). 利用柯里化增加约束条件,只有通过所有约束条件的数据才最终被执行;
b). 变量不会存在全局污染(保护变量的私有性),自由变量(函数内部不定义,但可以访问的变量,一般情况下是全局变量,或局部全局变量),约束变量(函数内部定义的变量,生命周期在函数内部)。函数(function)依赖自由变量,就会存在自身的返回值不可控的现象,这就是传说中的共享变量耦合。
c). 无限级柯里化固能实现,但不实用,用柯里化最主要的目的是为最终执行单元增加约束条件(参数分解),约束条件是有限的。
如需要约束条件是动态的,则应该选择下面介绍的”部分应用参数“
二、部分应用参数
部分应用参数的定义:传入任何多个约束条件,返回接受执行单元和参数的闭包。实现约束条件的预设置。代码如下:
function Parit(fun, parg){
return function(){
var args = _.toArray(arguments);
args.splice(0,0,parg);
return fun.apply(fun,args); //执行后必须返回
}
}
function condition1(){
var validators = _.toArray(arguments);
return function(fun, arg){
var errors = _.map(validators,function(data,irow){
return data(arg) ? [] : [data.name + ' error'];
});
if(!_.isEmpty(errors.join())){
console.info(errors.join());
return;
//throw new Error(errors.join());
}
return fun.call(fun,arg); //执行后必须返回
}
}
var sqlPre = condition1(_.isNumber); //sqlPre是闭包,需要fun,arg两个参数
function uncheckedSqr(n){ return n * n; }
console.log(sqlPre( uncheckedSqr,10) ); //本质
var sqr = Parit(sqlPre,uncheckedSqr); //返回一个闭包 uncheckedSqr作为sqlPre的第一个参数传入
console.log( sqr('5') );
console.log( sqr(5) );
2.2、部分参数应用:
a). 实现约束预设置,主要用于验证模块。
b).部分应用参数与柯里化主要区别于,柯里化每次只接受一个参数,而部分应用参数一次可以接受多个参数;但柯里化与部分应用参数都只能按照参数进行组合 。
三、总结
a). 柯里化的理解是javascript进阶的基础,在函数式编程中是极其重要一环。函数式编程主要讲究数据的不变性、集合操作、尾递归等。
JAVAScript柯里化、部分应用参数终极理解的更多相关文章
- JavaScript柯里化(currying)
参考: https://www.jianshu.com/p/33392cb4b055 https://ruby-china.org/topics/38385 https://stackoverflow ...
- javascript 柯里化
先看一下代码 function add(){ var sum=0; for(var i=0;i<arguments.length;i++){ sum+=arguments[i]; } retur ...
- javascript柯里化及组合函数~
大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...
- javascript柯里化
function curry(fn){ var slice = Array.prototype.slice; var arr = slice.call(arguments,1); return fun ...
- JavaScript的柯里化函数
柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写 JavaScript 代码的人来说可能会很费解.但如果使用得当,它可以使你的 JavaScript 函数更具可读性. 更具可读性 ...
- 简单粗暴详细讲解javascript实现函数柯里化与反柯里化
函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...
- JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道
上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...
- JavaScript函数式编程(纯函数、柯里化以及组合函数)
JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...
- 一道javascript面试题(闭包与函数柯里化)
要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...
随机推荐
- 搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展
上一篇:搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展 一.安装MongoDB 1.创建mongodb用户组和用户 groupadd mongodb useradd -r -g ...
- Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
在用maven命令启动storm时候,命令行是:mvn exec:java -Dexec.mainClass="TopologyMain" -Dexec.args="sr ...
- Leetcode-83 Remove Duplicates from Sorted List
#83. Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such that ...
- Ado.Net Destination 用法
Ado Net Destination Component 使用Ado net Connection manager,其Data Access Mode 只有一种, table or view,组件的 ...
- TSql 巧用Alt 键
1,查看表的信息 在TSql 编辑器中,选中一个表,如图 点击Alt+F1,就可以查看表的属性定义 2,使用alt批量插入逗号 在Tsql中使用 in 子句,在(value_List)列表中,经常有很 ...
- 【开源】OSharp框架解说系列(6.1):日志系统设计
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...
- SQL Server-语句类别、数据库范式、系统数据库组成(一)
前言 终于等到这一天,我要开始重新系统学习数据库了,关于数据库这块,不出意外的话,每天会定时更新一篇且内容不会包含太多,简短的内容,深入的理解,Always to review the basics. ...
- 使用jQuery封装实用函数
一.引言 项目开发中,前端会有一个辅助工具类的js文件,比如cookie的操作,团队成员自己封装的方法.大多数时候,我们开发人员自己都是写一个全局函数,不考虑后期维护人员也会写相同的代码,然后造成代码 ...
- iOS开发之调用系统打电话发短信接口以及程序内发短信
在本篇博客开头呢,先说一下写本篇的博客的原因吧.目前在做一个小项目,要用到在本应用程序内发验证码给其他用户,怎么在应用内发送短信的具体细节想不大起来了,于是就百度了一下,发现也有关于这方面的博客,点进 ...