函数柯里化
就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
简单示例
function curr(x) {
return function(y) {
return x+y;
}
}
let res = curr(2)(3);
console.log(res); // 5
还记得改变 this 指向的 ( bind )方法吗?
fun.bind(obj,1,2,3)()
来一段 伪代码 bind 方法最后一定是返回了一个函数,这个函数就是调用bind方法的函数本身
Function.prototype.bind = function(){
// xxxxx
// xxxxx
return function(){}
}
再看例子
// 正常正则验证字符串 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
上面的示例是一个正则的校验,正常来说直接调用check函数就可以了,但是如果我有很多地方都要校验是否有数字,其实就是需要将第一个参数reg进行复用,这样别的地方就能够直接调用hasNumber,hasLetter等函数,让参数能够复用,调用起来也更方便。
function curry(fn) {
let judge = (...args) => {
if (args.length == fn.length) return fn(...args)
return (...arg) => judge(...args, ...arg)
}
return judge
}
function add(a, b, c) {
return a + b + c
}
add(1, 2, 3)
let addCurry = curry(add)
addCurry(1)(2)(3)