我理解的Curry化

来源:互联网 发布:mars java 编辑:程序博客网 时间:2024/05/17 22:07

柯理化一直是一个我觉得很抽象的东西,之前一直都半懂不懂,今天好好研究了一下,理解上稍稍有点清晰,赶紧来记下来,以后有了更好的理解再来更新。

1.函数式编程

函数是第一等公民
所谓”第一等公民”,指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值

只用”表达式”,不用”语句”
“表达式”(expression)是一个单纯的运算过程,总是有返回值;”语句”(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

没有”副作用”
函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。

即所谓的只要是同样的参数传入,返回的结果一定是相等的。

2.柯理化

什么是柯理化?
柯里化,又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。

柯理化有什么作用?

  • 动态创建一个新函数——当新函数是基于现有函数,并加上部分参数列表创建时。
  • 延迟计算/运行,柯理化的复用——如果我们想对中间的某次返回函数进行复用或者其他处理。
  • 参数复用——当发现正在调用同一个函数,并且绝大多数是相同的。
  • 提前返回——兼容现代浏览器以及IE浏览器的事件添加方法。

应用场景示例
bind()方法的原生实现:

var obj={    name:"Joy"};function app(){   console.log(this.name);}if(typeof Function.prototype.bind === "undefined"){  Function.prototype.bind=function(context){    var arg=[].slice.call(arguments,1);    var _that=this;    return function(){        var _arg=arg.concat([].slice.apply(arguments));        return  _that.apply(context,_arg);    }  };}var app2=app.bind(obj);app2();//Joy

在这个函数中,我们主要做了这几件事:
1.利用call/apply与arguments对象收集参数。
2.接收单一参数,将更多收集的参数交给返回函数处理。

0 0
原创粉丝点击