1. 程式人生 > >柯裏化

柯裏化

ner var -c fault ons htm pre list ice

一、柯裏化

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

例如:

//柯裏化前
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));

這段代碼初看可能不太好理解,這裏我們將它拆分一下,其中涉及的知識點有:

valueOf() 方法

返回 Boolean 對象的原始值:

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

arguments對象

MDN,介紹的特別詳細。

arguments 是一個對應於傳遞給函數的參數的類數組對象。可以用下面的語句將arguments轉化成數組對象:

var numList = [].slice.call(arguments);

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

遞歸

可以看我的另一篇博客:遞歸

參考:

1、SegmentFault

2、柯裏化實現累加器

柯裏化