首頁  >  文章  >  web前端  >  js柯里化的實例詳解

js柯里化的實例詳解

零下一度
零下一度原創
2017-06-26 15:14:381500瀏覽

一、來源

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

二、curring(1)(2)(3)(4)() 如何實作參數相加得出結果為10呢?

1.其實我們只用思考如何把每個參數保留下來,最後在呼叫的時候,把參數累積起來? 這個是我們思考的重點。

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. 透過第一步我們可以把參數得到 那麼接下來我們想幹嘛,就可以幹嘛了。

如何實作相加呢? 

3.改變下基礎函數

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)()); // 10console.log(curring(1)(2,3,4)()); // 10

4.既然第三步驟相加實現了,那麼相乘啊,相除啊。等等一連串的操作都可以搞定了。不過要注意的時候,其中使用了閉包,如果連續呼叫同一個方法2次。

arg會保存在記憶體之中

console.log(curring(1)(2)(3)(4)()); // 10console.log(curring(1)(2,3,4)()); // 20

 

#

以上是js柯里化的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn