)閉包與柯裡化

來源:互聯網
上載者:User

閉包和柯裡化都是JavaScript經常用到而且比較進階的技巧,所有的函數式程式設計語言都支援這兩個概念,因此,我們想要充分發揮出JavaScript中的函數式編程特徵,就需要深入的瞭解這兩個概念,閉包事實上更是柯裡化所不可缺少的基礎。
      一、柯裡化的概念
      在電腦科學中,柯裡化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,並且返回接受餘下的參數且返回結果的新函數的技術。這個技術由Christopher Strachey以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。在直覺上,柯裡化聲稱“如果你固定某些參數,你將得到接受餘下參數的一個函數”。所以對於有兩個變數的函數yx,如果固定了y = 2,則得到有一個變數的函數2x。
      柯裡化就是預先將函數的某些參數傳入,得到一個簡單的函數。但是預先傳入的參數被儲存在閉包中,因此會有一些奇特的特性。比如:

    var adder = function(num){            return function(y){                  return num + y;            }      }      var inc = adder(1);      var dec = adder(-1)

這裡的inc/dec兩個變數事實上是兩個新的函數,可以通過括弧來調用,比如下例中的用法:

 //inc, dec現在是兩個新的函數,作用是將傳入的參數值(+/-)1      print(inc(99));//100      print(dec(101));//100      print(adder(100)(2));//102      print(adder(2)(100));//102

二、柯裡化的應用
      根據柯裡化的特性,我們可以寫出更有意思的代碼,比如在前端開發中經常會遇到這樣的情況,當請求從服務端返回後,我們需要更新一些特定的頁面元素,也就是局部重新整理的概念。使用局部重新整理非常簡單,但是代碼很容易寫成一團亂麻。而如果使用柯裡化,則可以很大程度上美化我們的代碼,使之更容易維護。我們來看一個例子:

    //update會返回一個函數,這個函數可以設定id屬性為item的web元素的內容      function update(item){            return function(text){                  $("div#"+item).html(text);            }      }      //Ajax請求,當成功是調用參數callback      function refresh(url, callback){            var params = {                  type : "echo",                  data : ""            };            $.ajax({                  type:"post",                  url:url,                  cache:false,                  async:true,                  dataType:"json",                  data:params,                  //當非同步請求成功時調用                  success: function(data, status){                        callback(data);                  },                  //當請求出現錯誤時調用                  error: function(err){                        alert("error : "+err);                  }            });      }      refresh("action.do?target=news", update("newsPanel"));      refresh("action.do?target=articles", update("articlePanel"));      refresh("action.do?target=pictures", update("picturePanel"));      其中,update函數即為柯裡化的一個執行個體,它會返回一個函數,即:      update("newsPanel") = function(text){            $("div#newsPanel").html(text);      }

由於update(“newsPanel”)的傳回值為一個函數,需要的參數為一個字串,因此在refresh的Ajax調用中,當success時,會給callback傳入伺服器端返回的資料資訊,從而實現newsPanel面板的重新整理,其他的文章面板articlePanel,圖片面板picturePanel的重新整理均採取這種方式,這樣,代碼的可讀性,可維護性均得到了提高。

 

轉自:http://www.yiiyaa.net/1314

其它相關文章:http://book.51cto.com/art/201211/367101.htm

 

      http://www.zhangxinxu.com/wordpress/2013/02/js-currying/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.