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