资讯专栏INFORMATION COLUMN

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

wanglu1209 / 2756人阅读

摘要:难道再把第一个参数加回去这样别人若使用了该库函数也要修改调用代码。使用库函数使函数柯里化避免每次调用重复传参使用场景将柯里化后的参数传递给等函数。

使用场景之一:减少重复传递不变的部分参数
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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95419.html

相关文章

  • JavaScript函数式编程,真香之组合(一)

    摘要:组合的概念是非常直观的,并不是函数式编程独有的,在我们生活中或者前端开发中处处可见。其实我们函数式编程里面的组合也是类似,函数组合就是一种将已被分解的简单任务组织成复杂的整体过程。在函数式编程的世界中,有这样一种很流行的编程风格。 JavaScript函数式编程,真香之认识函数式编程(一) 该系列文章不是针对前端新手,需要有一定的编程经验,而且了解 JavaScript 里面作用域,闭...

    mengbo 评论0 收藏0
  • 高级函数技巧-函数柯里

    摘要:如果你对函数式编程有一定了解,函数柯里化是不可或缺的,利用函数柯里化,可以在开发中非常优雅的处理复杂逻辑。同样先看简单版本的方法,以方法为例,代码来自高级程序设计加强版实现上面函数,可以换成任何其他函数,经过函数处理,都可以转成柯里化函数。 我们经常说在Javascript语言中,函数是一等公民,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理,return 结果,...

    shixinzhang 评论0 收藏0
  • 前端基础进阶(八):深入详解函数柯里

    摘要:函数被转化之后得到柯里化函数,能够处理的所有剩余参数。因此柯里化也被称为部分求值。那么函数的柯里化函数则可以如下因此下面的运算方式是等价的。而这里对于函数参数的自由处理,正是柯里化的核心所在。额外知识补充无限参数的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函数的一个比较高级的应用,想要...

    kk_miles 评论0 收藏0
  • JavaScript 函数式编程(二)

    摘要:注意是单一参数柯里化是由以逻辑学家命名的,当然编程语言也是源自他的名字,虽然柯里化是由和发明的。辨别类型和它们的含义是一项重要的技能,这项技能可以让你在函数式编程的路上走得更远。 slide 地址 三、可以,这很函数式~ showImg(https://segmentfault.com/img/remote/1460000015978685?w=187&h=160); 3.1.函数是一...

    thursday 评论0 收藏0
  • 掌握JavaScript函数柯里

    摘要:原文链接和都支持函数的柯里化函数的柯里化还与的函数编程有很大的联系如果你感兴趣的话可以在这些方面多下功夫了解相信收获一定很多看本篇文章需要知道的一些知识点函数部分的闭包高阶函数不完全函数文章后面有对这些知识的简单解释大家可以看看什么是柯里化 原文链接 Haskell和scala都支持函数的柯里化,JavaScript函数的柯里化还与JavaScript的函数编程有很大的联系,如果你感兴...

    DTeam 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<