閉包和柯里化都是 JavaScript 常常用到並且比較高級的技巧,全部的函數式編程語言都支持這兩個概念,所以,咱們想要充分發揮出 JavaScript 中的函數式編程特徵,就須要深刻的瞭解這兩個概念,咱們在第七章中詳細的討論了閉包及其特徵,閉包事實上更是柯里化所不可缺乏的基礎。
柯里化的概念
閉包的咱們以前已經接觸到,先說說柯里化。柯里化就是預先將函數的某些參數傳入,獲得一個簡單的函數,可是預先傳入的參數被保存在閉包中,所以會有一些奇特的特性。好比:
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的刷新均採起這種方式,這樣,代碼的可讀性,可維護性均獲得了提升。