资讯专栏INFORMATION COLUMN

关于js中的柯里化(Currying)与反柯里化(Uncurrying)

Rocko / 961人阅读

摘要:今天了解到一个新名词柯里化,研究一番后总结如下一柯里化定义把接受多个参数的函数变换成接受一个单一参数最初函数的第一个参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。如果使用反柯里化,则可以这样写震惊某前端只会,竟月入百万。。。

今天了解到一个新名词:柯里化,研究一番后总结如下:

一· 柯里化 定义

把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。缩小适用范围,创建一个针对性更强的函数。

通用实现
Function.prototype.currying = function (arg1) {
    var _this = this;
    return function () {
        [].unshift.call(arguments, arg1);
        return _this.apply(_this, arguments);
    }
};
示例

1.现有一个求和函数:

function sum(a, ...num) {
    return num.reduce((sum, e) => {
        return sum + e;
    }, a);
}

我们想要它在100的基础上求和则可以实现如下(有点类似python中的装饰器):

var total = sum.currying(100)(5, 6, 7, 8);
console.log(total)//126

2.测试接口请求:

var testApi = $.post.currying("/crm/customer/add");
var cb = (data) => console.log(data);
testApi({name: "大卫", "sex": "男"}, cb);
testApi({name: "小卫", "sex": "女"}, cb);
testApi({name: "中卫", "sex": "人妖"}, cb);

或者这样:

var testApi = ((url) => {
    return function () {
        $.post(url, arguments[0], (data) => console.log(data))
    }
})("/crm/customer/add");
testApi({name: "大卫", "sex": "男"});
testApi({name: "小卫", "sex": "女"});
testApi({name: "中卫", "sex": "人妖"});
二· 反柯里化 定义

基本就是柯里化反向操作了。扩大适用性。

通用实现
Function.prototype.uncurrying = function () {
    var _this = this;
    return function () {
        return _this.apply(arguments[0], [].slice.call(arguments, 1))
    }
};
示例

上边的通用实现方法中,由于:arguments对象不是一个 Array 。它类似于Array,但除了长度之外没有任何Array属性,但可以对它使用Array的方法。操作时需要这样:Array.prototype.unshift.call(arguments, arg)[].unshift.call(arguments, arg)

如果使用反柯里化,则可以这样写:

var array_unshift = Array.prototype.unshift.uncurrying();
array_unshift(arguments, arg)//震惊!某前端只会php,竟月入百万。。。

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

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

相关文章

  • JavaScript函数柯里

    摘要:函数柯里化的对偶是,一种使用匿名单参数函数来实现多参数函数的方法。这是基于的富应用开发的方法实现反柯里化可能遇到这种情况拿到一个柯里化后的函数,却想要它柯里化之前的版本,这本质上就是想将类似的函数变回类似的函数。 什么是柯里化? 官方的说法 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数...

    tommego 评论0 收藏0
  • 高阶函数应用 —— 柯里与反柯里

    摘要:柯里化通用式上面的柯里化函数没涉及到高阶函数,也不具备通用性,无法转换形参个数任意或未知的函数,我们接下来封装一个通用的柯里化转换函数,可以将任意函数转换成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 阅读原文 前言 在 JavaScript 中,柯里化和反柯里化是高阶函数的一种应用,在这之前...

    wyk1184 评论0 收藏0
  • JavaScript 函数式编程技巧 - 反柯里

    摘要:作为函数式编程语言,带来了很多语言上的有趣特性,比如柯里化和反柯里化。而反柯里化,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用范围,创建一个应用范围更广的函数。作为函数式编程语言,JS带来了很多语言上的有趣特性,比如柯里化和反柯里化。 可以对照另外一篇介绍 JS 柯里化 的文章一起看~ 1. 简介 柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩...

    zhjx922 评论0 收藏0
  • JS进阶篇--JS中的柯里( uncurrying)

    摘要:最后,我们反过来看,其实反柯里化相当于把原来的形式,转换成了,使得的使用范围泛化了。更抽象地表达,反柯里化,使得原来调用,可以转成形式的调用。 反柯里化 相反,反柯里化的作用在与扩大函数的适用性,使本来作为特定对象所拥有的功能的函数可以被任意对象所用.即把如下给定的函数签名, obj.func(arg1, arg2) 转化成一个函数形式,签名如下: func(obj, arg1, ar...

    LdhAndroid 评论0 收藏0
  • js 扩展 -- currying 柯里函数

    摘要:里也有柯里化的实现,只是平时没有在意。如果函数柯里化后虽然生搬硬套,不过现实业务也会有类似场景。 柯里化 先解释下什么是 柯里化 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 js 里也有柯里化的实现,只是平时没有在意。先把原文简介贴...

    Pocher 评论0 收藏0

发表评论

0条评论

Rocko

|高级讲师

TA的文章

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