柯里化

Posted PeriHe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了柯里化相关的知识,希望对你有一定的参考价值。

 一、柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

例如这样:

//柯里化前
function add(a, b) {
    return a + b;
} 
add(10, 2) // 12

//柯里化后
var add = function(a) {
    return function(b) {
        return a + b;
    };
};
var addTen = add(10);
addTen(2); // 12

二、利用柯里化实现累加器

function fn(){
    var numList = [].slice.call(arguments);
    var _fn = function(){
        var innerArguments = [].slice.call(arguments);
        numList = numList.concat(innerArguments);
        return _fn;
    }
    _fn.valueOf = function(){
        return numList.reduce(function(num1, num2){
            return num1 + num2;
        });
    }
    return _fn;
}
console.log(fn(1)(2)(3));

 这段代码初看可能不太好理解,这里我们将它拆分一下:

arguments对象

MDN,介绍的特别详细。

每一个js函数内部都有arguments,它代表传入的参数数组。arguments 是一个类数组对象。可以用下面的语句将arguments转化成数组对象:

var numList = [].slice.call(arguments); //将arguments转化成数组对象

还有常用的:[].slice.call(arguments, 1) 返回的是arguments数组从1号位开始的片段。用来获取arguments里除了第一项以外的其他所有选项。

valueOf() 方法   

返回 Boolean 对象的原始值:

<script type="text/javascript">
    var boo = new Boolean(false);
    document.write(boo.valueOf()); //false
</script>

这里也可以使用添加 toString() 的方式实现这一功能,与 valueOf() 做法一致。

reduce()方法

接收一个函数作为累加器。语法:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

使用范例:

var numbers = [65, 44, 12, 4];
function getSum(total, num) {
    return total + num;
}
function myFunction(item) {
    document.getElementById("demo").innerhtml = numbers.reduce(getSum);
}

递归

 可以看我的另一篇博客:递归

思路总结

首先若是想要实现 fn()() 这种调用方式的函数,则在 fn 函数体内一定也会返回一个函数。若是想要实现 fn()()()... 不定次数的调用,则意味着每一层的返回值均为一个函数,这就需要使用类似递归的方式去实现。在函数调用的最后一层,这个返回值应该是一个值而非函数,这里则需要使用 valueOf 这一方法。使用内置对象 arguments对函数中所传入的参数获取,arguments 不是数组,而是对象,将其转换为数组。使用数组的reduce 方法实现求和。

 

 

 

 

学习并感谢:

1、SegmentFault

2、柯里化实现累加器

3、柯里化与箭头函数

 

以上是关于柯里化的主要内容,如果未能解决你的问题,请参考以下文章

手写柯里化,实现柯里化

JS中的柯里化及精巧的自动柯里化实现

柯里化函数快速排序外边距重叠

js高阶函数应用—函数柯里化和反柯里化

Scala学习笔记——简化代码和柯里化

函数式编程:纯函数&柯里化&组合函数