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