一、柯里化

在定义柯里化、部分应用参数的概念前,首先必须对闭包有深入的了解和定义,闭包一句话说清楚:函数返回值为函数。

柯里化的定义:将多参函数分解为按步骤接受单个参数的函数,如下代码:

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柯里化、部分应用参数终极理解的更多相关文章

  1. JavaScript柯里化(currying)

    参考: https://www.jianshu.com/p/33392cb4b055 https://ruby-china.org/topics/38385 https://stackoverflow ...

  2. javascript 柯里化

    先看一下代码 function add(){ var sum=0; for(var i=0;i<arguments.length;i++){ sum+=arguments[i]; } retur ...

  3. javascript柯里化及组合函数~

    大家是不是看我上篇博文有点蒙.用的的curry和compose是什么鬼,怎么那么神奇.上篇博文也是主要用到了这两个函数.那今天我们来聊一下curry和compose,这两个东西是函数式编程很重要的东西 ...

  4. javascript柯里化

    function curry(fn){ var slice = Array.prototype.slice; var arr = slice.call(arguments,1); return fun ...

  5. JavaScript的柯里化函数

    柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写 JavaScript 代码的人来说可能会很费解.但如果使用得当,它可以使你的 JavaScript 函数更具可读性. 更具可读性 ...

  6. 简单粗暴详细讲解javascript实现函数柯里化与反柯里化

    函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...

  7. JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道

    上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...

  8. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...

  9. 一道javascript面试题(闭包与函数柯里化)

    要求写一个函数add(),分别实现能如下效果: (1)console.log(add(1)(2)(3)(4)()); (2)console.log(add(1,2)(3,4)()); (3)conso ...

随机推荐

  1. JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString

    JavaScript Json对象和Json对象字符串的关系 jsonObj<->JsonString 如下示例: 直接写的a1就是一个Json对象,a2 就是一个Json对象字符串; 通 ...

  2. GitFlow

    git工作流 始终保持有master分支(只要有目录,git就自动创建)和develop分支(手动创建) 一.主分支Master二.开发分支Develop三.临时性分支(最后发布要删除的)* 功能(f ...

  3. Distributed4:SQL Server 分布式数据库性能测试

    我使用三台SQL Server 2012 搭建分布式数据库,将一年的1.4亿条数据大致均匀存储在这三台Server中,每台Server 存储4个月的数据,Physical Server的配置基本相同, ...

  4. 实战MEF(4):搜索范围

    在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...

  5. C#6.0 十大常用特性

    一.字符串插值 (String Interpolation) C# 6之前我们拼接字符串时需要这样 var Name = "Jack"; var results = "H ...

  6. 外网访问原理分析 - 每天5分钟玩转 OpenStack(105)

    本节我们会将上节创建的 ext_net 连接到 router,并验证内外网的连通性. 更重要的,我们会分析隐藏在表象之下的原理. 将外网连接到 Neutron 的虚拟路由器,这样 instance 才 ...

  7. Android动画学习(二)——Tween Animation

    前两天写过一篇Android动画学习的概述,大致的划分了下Android Animation的主要分类,没有看过的同学请移步:Android动画学习(一)——Android动画系统框架简介.今天接着来 ...

  8. [Keras] Install and environment setting

    Documentation: https://keras.io/ 1. 利用anaconda 管理python库是明智的选择. conda update conda conda update anac ...

  9. 如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。

    开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解. 我这篇博文的标题之所以用了三句,是为了方便其他人好查找: 这里介绍的方法有 ...

  10. C语言 第六章 多重循环

    一.概要 在c语言中,if,switch,for,while,do-while可以相互间多次嵌套. if(){ for() { for() { } } } while() { for(){ } for ...