柯里化

什么是柯里化

Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

function foo(x, y) {
  return x + y;
}

// 柯里化
function bar(x) {
  return function(y) {
    return x + y;
  }
}

bar(1)(2); // 3

看到上面这个例子,我们明白柯里化其实就是先用一个函数接受一个参数,然后再返回一个函数接受另一个参数,最后返回计算结果。但是,有什么废了这么大功夫有什么用呢?

// 正常正则验证字符串 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就可以了,但是我们要检验很多地方有没有数字,那么我们就需要重复调用check且传入重复参数。通过柯里化就可以达到复用第一个参数。