js柯里化

1、來源閉包

在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。app

2、curring(1)(2)(3)(4)() 如何實現參數相加得出結果爲10呢?函數

1.其實咱們只用思考如何把每一個參數保留下來,最後在調用的時候,把參數累加起來? 這個是咱們思考的重點。this

function keepParams(){
var arg = [];
return function params(){
    if(arguments.length === 0){
        return arg;
    }
    Array.prototype.push.apply(arg,arguments);  //對apply方法不熟悉的能夠去百度下
    return params;
}
}

var curring = keepParams();
console.log(curring(1)(2)(3)(4)()); // [1, 2, 3, 4]

2. 經過第一步咱們能夠把參數獲得 那麼接下來咱們想幹嗎,就能夠幹嗎了。spa

如何實現相加呢? prototype

3.更改下基礎函數code

function add(){
    var sum = 0,l = arguments.length;
    for(var i = 0; i < l; i++){
        sum += arguments[i];
    }
    return sum;
};
function keepParams(fn){
    var arg = [];
    return function params(){
        if(arguments.length === 0){
            return fn.apply(this,arg);
        }
        Array.prototype.push.apply(arg,arguments);  //對apply方法不熟悉的能夠去百度下
        return params;
    }
}

var curring = keepParams(add);
//console.log(curring(1)(2)(3)(4)()); // 10
console.log(curring(1)(2,3,4)()); // 10

4.既然第三步相加實現了,那麼相乘啊,相除啊。等等一系列的操做均可以搞定了。不過須要注意的時候,其中使用了閉包,若是連續調用同一個方法2次。blog

arg會保存在內存之中內存

console.log(curring(1)(2)(3)(4)()); // 10
console.log(curring(1)(2,3,4)()); // 20
相關文章
相關標籤/搜索