js 扩展 -- currying 柯里函数

柯里化

先解释下什么是 柯里化html

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数并且返回结果的新函数的技术。

js 里也有柯里化的实现,只是平时没有在乎。先把原文简介贴出来,此文都来自于它,有兴趣的可直接访问:JavaScript 专题之函数柯里化前端

里面有段方法,关于柯里化函数:git

// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896
var curry = fn =>
    (judge = (...args) =>
        args.length === fn.length ? fn(...args) : arg => judge(...args, arg));

设计 es6 的一些特性,或许一会儿很难理解,这里稍微写的再繁琐下:es6

var curry = function(fn) {
    /**
     * judge
     * args: 柯里化函数的参数
     */
    return function judge() {
        var args = [].slice.call(arguments);
        // 柯里化定义的函数参数 == 调用该函数的参数
        if (args.length >= fn.length) {
            return fn(...args);
        } else {
            // 经过 ()() 形式调用 -- 柯里化
            return function() {
                var args2 = [].slice.call(arguments);
                // 拼接成新的参数,递归继续judge
                return judge.apply(null, args.concat(args2));
            };
        }
    };
};

场景举例

参数调用来调用去,都晕了,那到底有什么用呢?github

好比:实现不一样幅度的相加功能编程

var sum = function(increment, number) {
    return increment + number;
};
// 虽然都是相同的相加逻辑,可能在函数命名、功能定义上会有不一样(固然这里只是硬性举个例子)。
var addOne = sum;
var addTen = sum;

console.log(addOne(1, 5)); //6
console.log(addTen(10, 5)); //15

若是函数柯里化后:微信

var addOne = curry(sum)(1)(5); //6
var addTen = curry(sum)(10)(5); //15

虽然生搬硬套,不过现实业务也会有相似场景。这里能体会到 curry 带来的好处:app

  • 定制化。原有共性的方法,被拆成符合不一样场景的业务方法
  • 参数明确。因为 curry 是根据固定参数约定的,因此经过()()形式固化了参数用意(好比第一个是累加数,第二个是被相加数)

再举一个简单的 Promise 实现举个例子:函数式编程

function MyPromise(fn) {
    // currying
    this.resolveFn = function(callback) {
        return callback;
    }
    this.then = function(callback) {
        fn(this.resolveFn(callback));
    }
}

new MyPromise(function(resolve, reject) {
    setTimeout(function() {
        resolve(true)
    }, 1000)
}).then(function(data) {
    console.log(data);
})

参考

我只是知识点的“加工者”, 更多内容请查阅原文连接 , 同时感谢原做者的付出:

关于我

若是你以为这篇文章对你有帮助, 请点个或者分享给更多的道友。 函数

也能够扫码关注个人 微信订阅号 - [ 前端雨爸 ], 第一时间收到技术文章 , 工做之余我会持续输出

bVbtL5R?w=258&h=258

最后感谢阅读, 大家的支持是我写做的最大动力

相关文章
相关标签/搜索