看到一篇很是不错的文章,这里分享给你们:http://www.jianshu.com/p/fa3568087881。javascript
首先,柯里化的定义:你能够只透过部分的参数呼叫一个function,它会回传一个function 去处理剩下的参数。java
咱们从最简单的栗子开始:函数
var add = function(a) { return function(b) { return a + b; } } var addTen = add(10); addTen(5); // 15 同时,咱们还能够这样调用: add(10)(5); //15
上述add函数是柯里化以后的函数,通常咱们会以下定义add函数:工具
var add = function(a, b) { return a + b; }
通常的定义有什么问题呢,参数可能不当心多了,那多余的参数就会被忽略,也有可能传参传少了,那么函数执行会发生错误;而柯里化若是传部分参数只会返回要处理剩下参数的函数,make sense?blog
固然咱们有工具使咱们的函数柯里化,这里咱们举例用lodash的https://lodash.com/docs/4.17.4#curry:ip
var add = _.curry(function(a, b) { return a + b; })
var addTen = add(10); addTen(5); // 15 同时,柯里化也接受传多个参数: add(10)(5); //15
咱们再稍微深刻理解一下:get
var object = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}]; var getIds = object.map(o => (o.id));
上述代码明显是取objec里面各个id;这有个什么问题呢?咱们没有办法重用getIds这个函数,由于每次想拿到id,都得进行一次map和取id的操做,咱们再改进下这个函数:it
var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}]; var getId = (object) => (object.id); var getIds = objects.map(getId); //解释下为啥这里能够不用参数直接能够调用getId,由于fp(Function Programming)中函数是一等公民,function(a) {return getId(a);} 与 getId是等价的;
这样的,咱们抽出去里getId这个函数,可是依然不能彻底重用,由于每次还要进行一次map操做,再一次改进:io
var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}]; var getId = (object) => (object.id); var getIds = _.curry((objects) => objects.map(getId)); getIds(objects); //[1,2,3]
这个时候咱们就用到里柯里化,可是依然不够好,由于若是我想拿到每一个object的name呢,这个方法就作不到,咱们就再一次改进看看:function
var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}]; var getValues = _.curry((objects, key) => objects.map((object) => (object[key]))); getValues(objects, 'name')
这样的话,咱们就能取任何key的值了,只须要传入objects和key便可。
var objects = [{id: 1, name: 'test'}, {id: 2, name: 'test2'}, {id: 3, name: 'test3'}];
var getId = _.curry((property, object) => (object[property]));
var map = _.curry((fn, objects) => objects.map(fn));
var getValues = map(getId('id')); getValues(objects); 因为咱们对key值进行的操做可能不同,因此咱们能够传一个函数;
这就是咱们所介绍的curry啦,欢迎各位留言,提反馈!