偏函數是 JS 函數柯里化運算的一種特定應用場景。簡單描述,就是把一個函數的某些引數先固化,也就是設定預設值,返回一個新的函數,在新函數中繼續接收剩餘引數,這樣呼叫這個新函數會更簡單。
範例1
下面是一個型別檢測函數,接收兩個引數,第 1 個表示型別字串,第 2 個表示檢測的資料。
var isType = function (type, obj) { //偏函數
return Object.prototype.toString.call(obj) == '[object ' + type + ']';
}
該函數包含兩個設定引數,使用時比較繁瑣。一般常按以下方式進行設計。
var isString = function (obj) {
return Object.prototype.toString.call(obj) == '[object String]';
};
var isFunction = function (obj) {
return Object.prototype.toString.call(obj) == '[object Function]';
};
函數接收的引數單一,檢測的功能也單一和明確,這樣更便於在表示式運算中有針對性的呼叫。下面對 isType() 函數進行扁平化設計,程式碼如下:
var isType = function (type) {
return function (obj) {
return Object.prototype.toString.call(obj) == '[object ' + type + ']';
}
}
然後根據 JS 偏函數獲取不同型別檢測函數。
var isString = isType("String"); //專一功能檢測函數,檢測字串
var isFunction = isType("Function"); //專一功能檢測函數,檢測字串
應用程式碼如下:
console.log(isString("12")); //true
console.log(isFunction(function () {})); //true
console.log(isFunction({})); //false
範例2
下面範例設計一個 wrap() 偏函數,該函數的主要功能是產生一個 HTML 包裹函數,即樣式標籤。
function wrap(tag) {
var stag = '<' + tag + '>';
var etag = '</' + tag.replace(/s.*/, '') + '>';
return function(x) {
return stag + x + etag;
}
}
var b = wrap('b');
document.write(b('粗體字'));
var i = wrap('i');
document.write(i('斜體字'));
var u = wrap('u');
document.write(u('下劃線字'));