js柯里化


標(biāo)簽: js柯里化


js柯里化

  • 柯里化是什么
    • 在計算機(jī)科學(xué)中,柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。
    • 柯里化是指將使用多個參數(shù)的函數(shù)轉(zhuǎn)換成一系列使用一個參數(shù)的函數(shù)的技術(shù)。
    • 函數(shù)柯里化(function currying)又稱部分求值。一個currying的函數(shù)首先會接受一些參數(shù),接受了這些參數(shù)后,該函數(shù)并不會立即求值,而是繼續(xù)返回另外一個函數(shù),剛才傳入的參數(shù)在函數(shù)形成的閉包里被保存起來。待到函數(shù)真正需要求值的時候,之前傳入的參數(shù)都會被一次性用于求值。
    • js中的柯里化
      • 實列分析,計算每月開銷的函數(shù)。在每天結(jié)束之前,我們都要記錄今天花了多少錢
          var monthlyCost = 0;
        
          var cost = function(money){
              monthlyCost += money;
          };
        
          cost(100);//第一天開銷
          cost(200);//第二天開銷
          cost(300);//第三天開銷
          //cost(700);//第三十天開銷
        
          alert(monthlyCost);//輸出:600
        
        但我們不太關(guān)心每天花掉多少,只想知道月底總共花掉了多少,也就是說,只需要在月底計算一次;
        • 柯里化不完整實現(xiàn):
             var cost = (function(){
             var args = [];
          
             return function(){
                 if(arguments.length === 0){
                     var money = 0;
                     for(var i = 0, l = args.length; i < l; i++){
                         money += args[i];
                     }
                     return money;
                 }else{
                     [].push.apply(args, arguments);
                 }
             }
             }());
             cost(100);//未真正求值
             cost(200);//未真正求值
             cost(300);//未真正求值
             console.log(cost());//求值并輸出:600
          
        • 柯里化:
              var currying = function(fn){
                  var args = [];
                      return function inner(){
                          if(arguments.length === 0){
                              return fn.apply(this, args);
                          }else{
                              [].push.apply(args, arguments);
                              return inner;
                          }
                      }
              };
              var cost = (function(){
                  var money = 0;
                  return function(){
                      for(var i = 0, l = arguments.length; i < l; i++){
                          money += arguments[i];
                      }
                      return money;
                  }
              }());
              var cost = currying(cost);//轉(zhuǎn)化為currying函數(shù)
              cost(100);//未真正求值
              cost(200);//未真正求值
              cost(300);//未真正求值
              console.log(cost());
          
          

往期精彩回顧


廣州蘆葦科技web前端

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容