首頁 >web前端 >js教程 >Javascript閉包與函數柯里化淺析(圖文教學)

Javascript閉包與函數柯里化淺析(圖文教學)

亚连
亚连原創
2018-05-21 09:38:141049瀏覽

這篇文章主要介紹Javascript閉包與柯里化,通俗易懂,需要的朋友可以參考下。

閉包和柯里化都是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){
     $("p#"+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){
  $("p#newsPanel").html(text);
}

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

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

php讀取本機json檔案有哪些方法

php讀寫與修改json檔案步驟詳解

#關於JS中String()與.toString()的區別(結合程式碼,一目了然)

#

以上是Javascript閉包與函數柯里化淺析(圖文教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn