這篇文章主要介紹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的刷新均採取這種方式,這樣,程式碼的可讀性,可維護性均提高了。
上面是我整理給大家的,希望今後對大家有幫助。
相關文章:
#關於JS中String()與.toString()的區別(結合程式碼,一目了然)
#
以上是Javascript閉包與函數柯里化淺析(圖文教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!