一、來源
在計算機科學中,柯里化(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中文網其他相關文章!