科裏化

科裏化:這是函數閉包的一種特殊形式,建立一個函數的生成器.它接受函數的名字和參數,而且返回一個新的局部函數,它只須要剩餘的參數.api

舉個例子:數組

//科裏化函數

function
curry(fn,scope){
  var scope = scope || window;
  var args = [];

  for(var i = 2,len = arguments.length;i<len;++i){
    args.push(arguments[i]);
  }

  return function(){
    var args2 = [];
    for(var i=0;i<arguments.length;i++){
      args2.push(arguments[i]);
    }
    
    var argsTotal = args.concat(args2);
    return fn.apply(scope,argsTotal);
  }
}

//下面咱們來計算兩家基金1個月的利息金額

//rateA 表明 A基金的日利率
//rateB 表明 B基金的日利率
//days 表明 天數
//capital 表明 本金

function interest(rateA,rateB,days,capital){
  //咱們將返回一個數組
  //位置[0]表明A基金N天的盈利
  //位置[1]表明B基金N天的盈利
  return [rateA*days*capital,rateB*days*capital];
}

//假設咱們有5名顧客的資金須要計算
//假設A的日利率爲0.01,B爲0.02

//傳統方式:
interest(0.01,0.02,30,2000);
interest(0.01,0.02,40,3000);
interest(0.01,0.02,50,4000);
interest(0.01,0.02,30,5000);
interest(0.01,0.02,50,6000);

//0.01,0.02一直在重複,削弱了應用的性能

//使用科裏化方式:
var interestCurry = curry(interest,null,0.01,0.02);

interestCurry(30,2000);
interestCurry(40,3000);
interestCurry(50,4000);
interestCurry(30,5000);
interestCurry(50,6000);//科裏化方式給函數附加了一些參數,避免了大量的重複,curry也能夠接受做用域做爲參數,但本例沒有特定的做用域所以使用window對象.//不少框架都提供了curry方法,例如Dojo,jQuery,Prototype.js等.
相關文章
相關標籤/搜索