简述几个非常有用的柯里化函数使用场景

使用场景之一:减少重复传递不变的部分参数
lodash.curry

function simpleURL(protocol, domain, path) {
    return protocol + "://" + domain + "/" + path;
}

上面这个函数是将三个参数生成一个完成的url.调用如下:

var myurl = simpleURL('http', 'mysite', 'home.html');
var myurl2 = simpleURL('http', 'mysite', 'aboutme.html');

然后你会发现,前两个参数保持不变,但每次调用都需要传递。所以可以对其优化,仅传递最后一个变化的参数。
通常我们第一个想法是将函数改成如下:

function simpleURL(path) {
   return "http://mysite/" + path;
}

但是还是有点缺陷,如果这个库函数有被其它人使用呢,这种情况下基本上是不允许直接改库函数的。并且如果后期还需要处理https的请求呢。难道再把第一个参数加回去?这样别人若使用了该库函数也要修改调用代码。
针对这种情况,使用柯里化函数可以完美解决。
使用lodash.curry库函数使函数柯里化

// 避免每次调用重复传参
let myURL1 = _.curry(simpleURL)('https', 'mysite');
let res1 = myURL1('home.html');    //

console.log(res1);//https://mysite/home.html

let myURL2 = _.curry(simpleURL)('http', 'mysite');
let res2 = myURL2('aboutme.html');    //

console.log(res2);//http://mysite/aboutme.html

使用场景2:将柯里化后的callback参数传递给map, filter等函数。

比如我们有这样一段数据:

var persons = [{name: 'kevin', age: 11}, {name: 'daisy', age: 24}]
如果我们要获取所有的 name 值,我们一般会这样实现:

var names = persons.map(function (item) {
    return item.name;
});

我们可以利用柯里化改写成如下:

var getProp = _.curry(function (key, obj) {
    return obj[key]
});
var names = persons.map(getProp('name'))

我们为了获取 name 属性还要再编写一个 getProp 函数,是不是又麻烦了些?

但是请注意,getProp 函数编写一次后,以后可以多次使用,实际上代码从原本的三行精简成了一行,而且你看代码是不是更加易懂了?
demo:

var persons = [{name: 'kevin', age: 11}, {name: 'daisy', age: 24}]

let getProp = _.curry(function (key, obj) {
    return obj[key]
});
let names2 = persons.map(getProp('name'))
console.log(names2); //['kevin', 'daisy']

let ages2 = persons.map(getProp('age'))
console.log(ages2); //[11,24]

在这个场景中,将callback柯里化之后,就能实现callback的复用了,而且非常灵活,这样不需要每次map计算都新写一个匿名函数,并在回调里加上特有的逻辑,导致其无法重用。

从上面的例子中还可以看出,无论想要获取抽取出哪个属性值,只要这要写person.map(getProp('propertyname_xxx'))就可以轻松获取了。

总结:柯里化这个概念以及实现本身都非常难懂,平时写代码几乎也很少使用,能使用的场景真的不太多,大多数情况都选择了其它简单的方式实现了。在get到这个技能后,我认为以后可以在项目中适当使用这个方法,尽量减少重复代码。目前只研究了这么些,至于其它的好处和使用场景后期有机会再更新。

参考1: https://www.jianshu.com/p/9b6...
参考2:https://github.com/mqyqingfen...

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数柯里化(Currying)是一种将多个参数的函数转化为接受一个参数的函数,并返回接受余下参数的新函数的技术。它的好处和坏处如下: 好处: 1. 提高函数的复用性:柯里化可以将一个接受多个参数的函数转化为一系列接受单个参数的函数,使得函数的参数更加灵活。这样可以方便地复用这些单参数的函数,减少重复代码。 2. 延迟执行:柯里化可以延迟函数的执行,通过返回一个新函数,可以在后续的代码中通过传递剩余参数来触发函数的执行。这种延迟执行的特性可以带来更好的代码控制和组合。 3. 部分应用:柯里化可以通过提供部分参数来创建一个新函数,这个新函数可以在后续代码中提供剩余参数进行调用。这种部分应用的特性可以方便地创建可重用的函数模板。 坏处: 1. 难以理解和调试:由于柯里化会增加函数的嵌套和抽象层级,使得代码变得更加复杂,对于初学者来说可能难以理解和调试。 2. 性能损耗:柯里化会引入额外的函数调用和闭包,可能会导致一定的性能损耗。尤其是在柯里化的链式调用过程中,每一步都需要创建新的函数。 3. 不适合所有场景柯里化更适用于多个参数之间具有相关性的场景,对于参数之间没有相关性的函数柯里化可能会增加不必要的复杂性。 综上所述,函数柯里化在合适的场景下可以带来代码的简洁和灵活性,但也需要权衡好其带来的复杂性和性能损耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值