JS偏函數

2020-07-16 10:05:05
偏函數是 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('下劃線字'));