JS中的函數柯里化


1. 概念

”函數柯里化”是指將多變量函數拆解為單變量的多個函數的依次調用, 可以從高元函數動態地生成批量的低元的函數。

簡單講:就是利用函數執行,可以形成一個不銷毀的私有作用域,把預先處理的內容都存在這個不銷毀的作用域里面,

              並且返回一個函數,以后要執行的就是這個函數。


舉個栗子:

// 常規的add函數
function add(x, y) {
    return x + y
}

// Currying后
function curryingAdd(x) {
    return function (y) {
        return x + y
    }
}

add(1, 2)           // 3
curryingAdd(1)(2)   // 3

在柯里化后,將函數的一個參數拆分為兩個乃至更多參數

 

2. 用途

2.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 hasString = curryingCheck(/[a-z]+/g)

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

對於正則的校驗,如果有很多地方都要校驗是否有數字,我們只需要將第一個參數reg進行復用,

這樣別的地方就能夠直接調用hasNumber,hasString等函數,讓參數能夠復用。

 

2.2 提前返回
//把isSupport這個參數給先確定下來
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);
            }
        };
    }
})();

//后一種方法
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);
    }
}

后一種方法可以避免每次都進行判斷,提前確定了哪一種方法,提前返回。

 

2.3 延遲運行

bind函數實現機制就是柯里化的封裝

Function.prototype.bind = function (context) {
    var _this = this
    var args = Array.prototype.slice.call(arguments, 1)
 
    return function() {
        return _this.apply(context, args)
    }
}

延遲執行,在沒有輸入參數時,不計算總結果。等需要計算的時候,再計算。

 

本文引自:https://blog.csdn.net/aaaaa1994/article/details/94359366

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM