浅谈JavaScript中的柯里化函数
首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu):
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
用于创建已经设置好了一个或多个参数的函数 与函数绑定相似,他们之间的区别在于:当函数被调用时,返回的函数还需要设置一些传入的参数
下面我们来看看具体的代码:
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);
};
}
相应的调用:
function add(num1, num2){
return num1 + num2;
} var curriedAdd = curry(add, 5);
alert(curriedAdd(3)); //
那么,下面我们来一步一步的解释上面的curry函数: 首先,不要被其形式参数所迷惑,难不成就只能传一个参数了吗? 当然不是,js是支持可变参数的,我们并不要求其参数形式,最终调用者传过来的所有参数我们都可以通过arguments来访问,OK,我们先来解释第一行:
var args = Array.prototype.slice.call(arguments, 1);
要读懂这一句的前提是我们要熟悉call函数的调用,以及Array对象的slice方法的熟悉,此处不再累赘,读者可以自行去查,调用slice(1)将会返回除了第一个元素以外的后面的所有的元素的数组形式。 同时他具备将调用者直接将arguments转换为数组形式的能力,我们此处是用函数的arguments去调用的slice(); 官方给arguments的定义是:
An argument is a value (primitive or object) passed as input to a function.
arguments
对象并不是一个真正的Array
。它类似于数组,但没有数组所特有的属性和方法,除了 length。例如,它没有 pop 方法。不过可以通过slice将其转换成数组:
此处的结果是: args = [5] 此时args保存了来自外部函数的数组
那么:接下来,我们将一个匿名函数返回给了调用者,此处形成了一个闭包, 对闭包不是很熟悉的童鞋可以看看我之前写过的一篇文章: http://www.cnblogs.com/Frank-C/p/4964999.html
将这个匿名函数返回以后呢:下一步我们就开始调用了curriedAdd(3):我们现在讲目光转向这个匿名函数:
return function(){
var innerArgs = Array.prototype.slice.call(arguments),
finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
再次调用slice,注意,读者应该将此时的arguments和之前再匿名函数在外curry函数之内的arguments区分,他们的调用者和调用方式都不一样了哦。 此处,我们把调用方传过来的参数转化为数组,—》》》innerArgs = [3] 然后:我们连接两个数组
---》》》finalArgs = [5,3];
最后我们直接调用之前传入的函数fn(通过curry函数传入)来时实现最终的add方法,此处没有用call函数,而是用的apply函数,是因为关系到他们两个之间的差别,apply的参数是可以用数组包裹的!!!
通过上面的几步的简单讲解。我们可以总结:函数的柯里化其实就是在调用一个拥有多个参数的函数之前,提前传入他们的部分参数,后期调用时就只要传余下的部分了!
浅谈JavaScript中的柯里化函数的更多相关文章
- javascript中利用柯里化函数实现bind方法
柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...
- JavaScript中的柯里化
转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...
- 【译】理解JavaScript中的柯里化
译文开始 函数式编程是一种编程风格,这种编程风格就是试图将传递函数作为参数(即将作为回调函数)和返回一个函数,但没有函数副作用(函数副作用即会改变程序的状态). 有很多语言采用这种编程风格,其中包括J ...
- 柯里化函数之Javascript
柯里化函数之Javascript 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...
- JS中的柯里化(currying)
何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...
- javascript之反柯里化(uncurrying)
在JavaScript中,当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法,这是动态类型语言的特点.可以通过反柯里化(uncurrying)函数实现,让一个对象去借用一个原 ...
- JavaScript的柯里化函数
柯里化,或者说部分应用,是一种函数式编程的技术,对于熟悉以传统方式编写 JavaScript 代码的人来说可能会很费解.但如果使用得当,它可以使你的 JavaScript 函数更具可读性. 更具可读性 ...
- JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
随机推荐
- 制作简易计算器处理过程Servlet
CalculationServlet.java: package com.you.servlet; import java.io.IOException; import java.io.PrintWr ...
- Spring MVC 基础
Spring MVC 基础 1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是 ...
- V微软S2015下载:开展Win10/Linux/iOS多平台软件
微软VS2015下载:开展Win10/Linux/iOS多平台软件 资源:IT之家作者:子非 责任编辑:子非 11月13日消息,微软刚刚宣布了 Visual Studio 2015 ...
- NServiceBus开发
使用NServiceBus开发分布式应用 系列主题:基于消息的软件架构模型演变 NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Ser ...
- ReactJS学习 相关网站
React 入门实例教程-阮一峰 http://www.ruanyifeng.com/blog/2015/03/react.html汇智网-React 互动学习http://hubwiz.com/co ...
- Fuel 5.1安装openstack I版本号环境
声明:本博客欢迎转载,但请保留原作者信息! 作者:傅斌杰 团队:华为杭州OpenStack团队 Fuel 简单介绍 Fuel是Mirantis公司开发的部署openstack集群工具,主要功能为裸机P ...
- ef添加字段
先在实体类里添加字段 ,然后执行 Add-Migration updateNumberOfLikes Update-Database -Verbose
- poj 2762 Going from u to v or from v to u? (推断它是否是一个薄弱环节图)
意甲冠军:给定一个有向图有m单向边缘.免费推断是否两点起来(a可以b要么b可以a或最多彼此),该请求 弱联通重量. 算法: 缩点求强连通分量.然后又一次建图.推断新图是否是一条单链,即不能分叉,假设分 ...
- SharePoint使用BCS开发你第一个应用程序(三)
SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型. 创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoin ...
- Arcgis for Javascript之featureLayer图和属性互操作性
说明:主要实现加载FeatureLayer并显示属性表,而要实现联动属性表与地图,首先,看看实施后的效果: 显示效果 如上图所看到的,本文章主要实现了下面几个功能:1.FeatureLayer属性表的 ...