函数柯里化

68 阅读1分钟

函数柯里化

就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

简单示例

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)