一、來源 在電腦科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses ...
一、來源
在電腦科學中,柯里化(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)()); // 10 console.log(curring(1)(2,3,4)()); // 10
4.既然第三步相加實現了,那麼相乘啊,相除啊。等等一系列的操作都可以搞定了。不過需要註意的時候,其中使用了閉包,如果連續調用同一個方法2次。
arg會保存在記憶體之中
console.log(curring(1)(2)(3)(4)()); // 10 console.log(curring(1)(2,3,4)()); // 20