首先,不可避免的要引经据典啦,什么是柯里化函数呢(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中的柯里化函数的更多相关文章

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

    柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...

  2. JavaScript中的柯里化

    转载自:https://www.cnblogs.com/zztt/p/4142891.html 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Ha ...

  3. 【译】理解JavaScript中的柯里化

    译文开始 函数式编程是一种编程风格,这种编程风格就是试图将传递函数作为参数(即将作为回调函数)和返回一个函数,但没有函数副作用(函数副作用即会改变程序的状态). 有很多语言采用这种编程风格,其中包括J ...

  4. 柯里化函数之Javascript

    柯里化函数之Javascript 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...

  5. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  6. javascript之反柯里化(uncurrying)

    在JavaScript中,当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法,这是动态类型语言的特点.可以通过反柯里化(uncurrying)函数实现,让一个对象去借用一个原 ...

  7. JavaScript的柯里化函数

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

  8. JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]

    JS中的柯里化(currying) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpr ...

  9. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

随机推荐

  1. RH033读书笔记(4)-Lab 5 File Permissions

    Lab 5 File Permissions Sequence 1: Determining File Permissions 1. What is the symbolic representati ...

  2. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  3. PHP关联数组和哈希表(hash table) 未指定

    PHP有数据的一个非常重要的一类,就是关联数组.又称为哈希表(hash table),是一种很好用的数据结构. 在程序中.我们可能会遇到须要消重的问题,举一个最简单的模型: 有一份username列表 ...

  4. android:强大的图像下载和缓存库Picasso

    1.Picasso一个简短的引论 Picasso它是Square该公司生产的一个强大的图像下载并缓存画廊.官方网站:http://square.github.io/picasso/ 仅仅须要一句代码就 ...

  5. 【Android进阶】ZXing android 错误(Could not find class 'com.google.zxing.ResultPoint)

    解决方法: 1.右键工程Build path, java build path,选择libraries 在右边的按钮中点击"Add Library" 选择"User li ...

  6. Android中的表格布局TableLayout

    表格布局最基本的三个属性: XML代码实例: <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  7. linux shell 不同进制数据转换(二进制,八进制,十六进制,base64) (转)

    shell可以在不调用第3方命令,表示不同进制数据.这里总结以下表示方法.shell 脚本默认数值是由10 进制数处理,除非这个数字某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值.如:以 0 ...

  8. 于linux已安装moodle

    本文介绍了两个虚拟机的安装linux server 及相关服务,随着后这些基础.安装应用程序服务 moodle 2.7+  它是使用最广泛的平台,网络课程. 在安装过程中moodle之前,需要支持软件 ...

  9. Visual Studio 原生开发的10个调试技巧(二)

    原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原 ...

  10. django简单图表

    Settings.py:项目的配置文件.包含数据库配置信息;模板路径的配置信息;webserver的配置信息;app的配置信息等其他配置信息. urls.py:函数与模板相应关系的配置信息,能够理解为 ...