柯理化函数

作者: 娜姐聊前端 | 来源:发表于2017-05-27 22:25 被阅读350次

函数柯理化的表现是:把一个需要传入多个变量的函数变为多个嵌套函数,并且内层函数会调用上层函数的变量。

现在有一个简单的add函数:

function add(x, y) {
    return x + y;
}
console.log(add(1, 2)); // 3

将其改为柯理化函数

function add2(x) {
    return function (y) {
        return x + y;
    }
}

console.log(add2(1)(2)); // 3

从上面的例子可以看出,柯理化很像现在流行的组件化开发模式,将多个函数模块组合起来,得到一个新的函数。

柯理化函数的核心是闭包,因为闭包,所以内层函数才能够保留父作用域中的变量。

通用柯理化函数

1. 版本一

创建一个通用的柯理化函数的方式如下:

function currying(fun) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function () {
        var _args = args.concat(Array.prototype.slice.call(arguments));
        return fun.apply(null, _args);
    }
}

可以看到,currying函数将除了第一个fn变量,将其他参数变量都赋值在args变量中,然后将其合并在返回函数的变量参数中,给返回函数使用。

现在,利用currying改造一个支持多个入参的add函数(采用ES6语法):

// 支持多个入参
function add(...vals) {
    return vals.reduce((pre, val) => {
        return pre + val;
    });
}

var newAdd = currying(add, 1, 2, 3);
console.log(newAdd(4, 5, 6)); // 21

这种方式创建的柯理化函数只能调用一次。

2. 版本二

再实现一种柯理化工厂函数,可以多次调用,最后统一求值。

function currying(fn) {
    var args = Array.prototype.slice.call(arguments, 1);

    return function () {
        if (arguments.length === 0) {
            return fn.apply(this, args);
        }
        else {
            Array.prototype.push.apply(args, arguments);
            return arguments.callee;
        }
    }
}

利用上面的currying改造add函数:

function add() {
    var vals = Array.prototype.slice.call(arguments);
    return vals.reduce((pre, val) => {
        return pre + val;
    });
}

var newAdd = currying(add, 1, 2, 3);
newAdd(4, 5);
newAdd(6, 7);

console.log(newAdd());  // 28

这种方式,把每次函数调用的参数都存储起来,如果已无参形式调用,说明记录结束,需要做最终计算。

小结

总之,柯理化就是利用模块化思想处理多参函数,通过组合函数减少每个函数的入参数量,从而提高代码的可阅读性及可维护性。

微信公众号:

相关文章

  • 柯理化函数

    函数柯理化的表现是:把一个需要传入多个变量的函数变为多个嵌套函数,并且内层函数会调用上层函数的变量。 现在有一个简...

  • 函数柯理化

    https://www.jianshu.com/p/5e1899fe7d6b

  • JS函数柯理化实现

    测试例子一 测试例子二 代码分析 1.sum(x)(y)(z)...要能够调用,该函数返回值必须是一个functi...

  • 函数式编程:柯理化函数和组合函数

    柯理化函数和组合函数都归属于函数式编程,用于解决函数式编程的问题 首先先说明一下函数式编程和面向对象式编程的优缺点...

  • 秒懂高阶编程之函数绑定及柯理化函数思想

    在介绍柯理化函数思想之前我先讲一个定义,叫函数绑定。 所谓函数绑定,就是要创建一个函数,可以在特定的this环境中...

  • 【js基础】函数柯理化的实现

    函数式编程 与面向对象编程(Object-oriented programming)和过程式编程(Procedur...

  • 对于柯理化函数的理解(JS)

    前言 最近遇到了函数式编程的柯理化函数,于是对着这块“硬骨头”硬着皮头读下去...。经过一番边读边学、消化、学习....

  • 函数柯里化

    高程二十二章中有介绍 先提供柯理化函数模板便于记录,待用熟用明白再来分享。

  • Function Currying

    函数柯理化,很多人觉得很难理解。其实难就难在它的翻译并不恰当。如果翻译成 部分绑定函数 含义是不是一目了然?学过C...

  • [译]JavaScript中的函数柯里化

    原文 Currying in JS 函数柯里化 函数柯里化以Haskell Brooks Curry命名,柯里化是...

网友评论

    本文标题:柯理化函数

    本文链接:https://www.haomeiwen.com/subject/tgiqfxtx.html