JS函式柯里化
阿新 • • 發佈:2022-04-02
有哪些好處
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