函数柯里化currying,是函数式编程非常重要的一个标志。它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去。我们依靠这个特性编写很多优雅酷炫的代码。那我们来看一下最简单的实现。

大家一般都是举addSum的例子,我当然也不例外。

add = (num1)->

return (num2)->

return num1 + num2;

add3 = add(3);

add5 = add(5);

add3(5) # 返回8

add5(5) # 返回10

上述例子其实已经对柯里化的实现,有一个非常好的了解了。其实也就是“分步求值”,我们可以把第一个参数通过闭包保存起来,以供return出去的匿名函数使用。所以我们可以根据add来自定义各种各样的新函数。

我们要使某个函数可以柯里化,难道一定要在函数创建时,就具有柯里化的特性么?假设我们的add函数,起初并不具有柯里化特性的,我们需要怎么做才能让它柯里化呢?

add = (num1, num2)->

return num1 + num2;

curry = (fn)->

args = [].slice.call(arguments, 1);

return ()->

[].push.apply(args, arguments);

return fn.apply(this, args);

add5 = curry(add, 5)

add5(3) # 返回8

原理还是一样的,我们通过curry函数,让fn需要的第一次的参数通过闭包保存在args的变量里,以供匿名函数使用。最后结合第二次需要的参数,使用apply一次性导入args,完成操作。

上述我们看到的都是分两步求值,这其实并不符合我们更丰富的实际需求。我们需要考虑如何才可以将函数柯里化变成我们需要的想分步便分步,想停止便停止呢?

首先我们需要约定一个规则,这个规则和大部分的Getter/Setter方法一样。当函数没有参数时,执行的是Getter,而有参数的话,则是执行“Setter”。(这个也是Javascript实现简陋的函数重载的一种方法)

curry = (fn)->

args = [];

return ()->

if arguments.length == 0

return fn.apply(this, args);

else

[].push.apply(args, arguments);

return arguments.callee;

addSum = ()->

sum = 0;

for num in arguments

sum += num;

return sum;

currySum = curry(addSum);

currySum(1, 2, 3);

currySum(1);

currySum(1);

currySum(1);

currySum(1);

currySum(); # 返回 10

实现原理其实也很简单,通过闭包,将每次的参数保存在args数组了。当不传参执行Getter时,就直接通过apply函数,将数组参数导入。我们只需要在addSum函数那里处理好导入的参数数组即可。

更多的柯里化带来的妙处,则需要你在实际使用中,细细品味。相信一旦你掌握了这个灵活可靠的方法,可以为你带来不一样的感受。

curry化 js_Javascript函数柯里化(curry)相关推荐

  1. 什么是函数柯里化,函数柯里化的应用场景,函数柯里化的优缺点

    函数柯里化 1. 什么是函数柯里化? 2. 函数柯里化面试题 3. 应用场景 1. 什么是函数柯里化? 函数柯里化是js闭包的典型应用.所以缺点就是闭包造成的缺点,占用内存较多等 什么是函数柯里化?就 ...

  2. 函数的 柯里化和反柯里化

    函数1 函数的柯里化 柯里化(currying)是把接收多个参数的函数变换成为接收一个部分参数的函数,并返回接收余下参数的新函数的技术.通常这个参数是一个. 可能我们对这个解释不太明白. 现在我们来思 ...

  3. JavaScript 中函数 柯里化风格的运用

    导语 当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 "高大上"的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后 ...

  4. 打造属于自己的underscore系列(五)- 偏函数和函数柯里化

    这一节的内容,主要针对javascript函数式编程的两个重要概念,偏函数(partial application) 和函数柯里化(curry)进行介绍.着重讲解underscore中对于偏函数应用的 ...

  5. JavaScript 专题之函数柯里化

    JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...

  6. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  7. 高级函数技巧-函数柯里化

    我们经常说在Javascript语言中,函数是"一等公民",它们本质上是十分简单和过程化的.可以利用函数,进行一些简单的数据处理,return 结果,或者有一些额外的功能,需要通过 ...

  8. bind函数返回值-1_javascript函数柯里化

    函数柯里化 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Chris ...

  9. 函数柯里化的几个例子

    函数柯里化 用于创建一个已经设置好了一个或或者多个参数的函数 通用写法如下: function curry(fn){var args = Array.prototype.slice.call(argu ...

  10. 深入详解python高级特性——函数柯里化(Currying)与反柯里化

    前言:本章的内容本来很简单,但是涉及到的理论部分相对较多,想要彻底弄懂前因后果需要具备以下几个知识点, (1)python的高阶函数 (2)python的装饰器本质 (3)Python的functoo ...

最新文章

  1. 面试官:说说你对ZooKeeper集群与Leader选举的理解?
  2. Wireshark抓包工具使用教程以及常用抓包规则
  3. Java多线程并发技术
  4. 看oracle 的数据库位数
  5. Hotmail怎么进不去?!
  6. java calendar 2月份_Java Calendar类使用总结
  7. CSS z-index 属性 控制div上下层次
  8. DL-C1-week3-1(build a neural network with one hidden layer)多层感知机的简单实现
  9. nexus3 测试操作
  10. win10安装steam有损计算机,Win10专业版无法安装steam软件怎么办?
  11. 获得各城市区号JS代码
  12. 最新!2019 年中国程序员薪资生存调查报告出炉
  13. 如何使用PS改变只有一种颜色图片的颜色
  14. 亚马逊测评日记: 亚马逊自养号是什么意思?测评的风险?review和feedback、rating星级评分的区别?
  15. 电脑进入pe时蓝屏_进PE蓝屏的几个原因
  16. 基于OBD系统的量产车评估测试(PVE),你知多少?
  17. dell720服务器支持的显卡,Dell Poweredge 服务器显卡选择
  18. 在线问诊小程序|互联网医院系统好处有哪些?
  19. android录音声波动画,Android开发:仿微信 录音声波
  20. indexedDB介绍

热门文章

  1. (转)那些年不容错过的硅谷IT公司
  2. Nuxt学习笔记——集成 Google 统计分析服务
  3. 中职计算机教学工作随笔,教学随笔(精选15篇)
  4. HDU 4966 GGS-DDU [最小树形图]
  5. 一天一个小算法——最小生成树(kru Prm)
  6. 你真的认为iPhone只是一部手机?苹果惊天秘密之 四
  7. stl源码 vector不正规解析2 (自用)VS2019
  8. 公告栏模板php代码,如何实现手机端公告栏显示
  9. 我的世界服务器银行系统,我的世界多功能银行系统制作教程
  10. C++-线程的join和detach