柯里化

 1、柯里化

柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。javascript

例如這樣:html

//柯里化前
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

2、利用柯里化實現累加器

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));

 這段代碼初看可能不太好理解,這裏咱們將它拆分一下:java

arguments對象

MDN,介紹的特別詳細。segmentfault

每個js函數內部都有arguments,它表明傳入的參數數組。arguments 是一個類數組對象。能夠用下面的語句將arguments轉化成數組對象:數組

var numList = [].slice.call(arguments); //將arguments轉化成數組對象

還有經常使用的:[].slice.call(arguments, 1) 返回的是arguments數組從1號位開始的片斷。用來獲取arguments裏除了第一項之外的其餘全部選項。app

valueOf() 方法   

返回 Boolean 對象的原始值:函數

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

這裏也可使用添加 toString() 的方式實現這一功能,與 valueOf() 作法一致。學習

reduce()方法

接收一個函數做爲累加器。語法:spa

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

使用範例:code

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 方法實現求和。

 

 

 

 

學習並感謝:

一、SegmentFault

二、柯里化實現累加器

三、柯里化與箭頭函數

相關文章
相關標籤/搜索