1. 程式人生 > 其它 >JS函式柯里化

JS函式柯里化

有哪些好處

1. 引數複用
// 正常正則驗證字串 reg.test(txt)

// 函式封裝後
function check(reg, txt) {
    return reg.test(txt)
}

check(/\d+/g, 'test')       //false
check(/[a-z]+/g, 'test')    //true

// Currying後
function curryingCheck(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}

var hasNumber = curryingCheck
(/\d+/g) var hasLetter = curryingCheck(/[a-z]+/g) hasNumber('test1') // true hasNumber('testtest') // false hasLetter('21212') // false
2. 提前確認
var on = function(element, event, handler) {
    if (document.addEventListener) {
        if (element && event && handler) {
            element.
addEventListener(event, handler, false); } } else { if (element && event && handler) { element.attachEvent('on' + event, handler); } } } var on = (function() { if (document.addEventListener) { return function(element, event, handler
) { if (element && event && handler) { element.addEventListener(event, handler, false); } }; } else { return function(element, event, handler) { if (element && event && handler) { element.attachEvent('on' + event, handler); } }; } })(); //換一種寫法可能比較好理解一點,上面就是把isSupport這個引數給先確定下來了 var on = function(isSupport, element, event, handler) { isSupport = isSupport || document.addEventListener; if (isSupport) { return element.addEventListener(event, handler, false); } else { return element.attachEvent('on' + event, handler); } }
3. 延遲執行
Function.prototype.bind = function (context) {
    var _this = this
    var args = Array.prototype.slice.call(arguments, 1)
 
    return function() {
        return _this.apply(context, args)
    }
}

 

通用的封裝方法

// 初步封裝
var currying = function(fn) {
    // args 獲取第一個方法內的全部引數
    var args = Array.prototype.slice.call(arguments, 1)
    return function() {
        // 將後面方法裡的全部引數和args進行合併
        var newArgs = args.concat(Array.prototype.slice.call(arguments))
        // 把合併後的引數通過apply作為fn的引數並執行
        return fn.apply(this, newArgs)
    }
}

 

參考地址 https://www.jianshu.com/p/2975c25e4d71

 

// 正常正則驗證字串 reg.test(txt)

// 函式封裝後
function check(reg, txt) {
    return reg.test(txt)
}

check(/\d+/g, 'test')       //false
check(/[a-z]+/g, 'test')    //true

// Currying後
function curryingCheck(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}

var hasNumber = curryingCheck(/\d+/g)
var hasLetter = curryingCheck(/[a-z]+/g)

hasNumber('test1')      // true
hasNumber('testtest')   // false
hasLetter('21212')      // false