欢迎找我内推微软

函数柯里化

函数柯里化

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成

接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

经典例子

add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;

这个 add 函数就是一个柯里化的函数,实现如下:

function add() {
    // 将伪数组arguments转化为数组并存储在_args中,以后接受的所有参数也都存储在_args中
    let _args = [].slice.call(arguments);
    
    // _adder 函数将以后接收的参数都存储到_args中
    let _adder = function () {
        _args.push(...arguments);
        // 返回自身(函数),从而可以无限接收参数
        return _adder;
    }
    
    // 为何使用toString见下文
    // toString 返回最后取值, 即所有参数的和
    _adder.toString = function () {
        return _args.reduce(function (sum, item) {
            return sum + item;
        });
    }
    
    //返回_adder函数
    return _adder;
}

为何使用toString

在对象为操作数(表达式中的参数或常量)时,解释器会默认调用对象的valueOf函数,

当对象为Date类型且在进行 + 运算时,以及其他所有情况中,解释器会默认调用对象的 toString 函数。

因此,对于上述的add函数,当我们进行类似于 add(1)(2)(3)这样的调用时,由于返回的是一个函数,当我们试图单独调用时,解释器就会对其调用toString来对其转换。

当其在表达式中时,例如 add(1)(2)(3) + 5时,解释器会先调用_addervalueOf函数,没有此函数时则会调用toString函数。

参考文章

https://blog.csdn.net/shaofei63/article/details/42743245

https://jingyan.baidu.com/album/3c48dd347c0474e10be358af.html?picindex=3

https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin

https://www.jianshu.com/p/2975c25e4d71

posted @ 2019-05-30 11:55  zmj97  阅读(323)  评论(0编辑  收藏  举报
欢迎找我内推微软