Skip to content

函数柯里化

函数柯里化是接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数。并且返回接受余下的参数而且返回结果的新函数的技术。

可以从调用 fn(a,b,c) 转变为 fn(a)(b)(c)

javascript
function curry(fn){
  return function(a){
    return function(b){
      return fn(a,b)
    }
  }
}
function sum (a,b) {
  return a + b
}
let sumCurry = curry(sum)
sum(1,2)
// 3
sumCurry(1)(2)
// 3

函数柯里化的用途

参数复用

正则校验的时候有的时候有很多参数,可以设置reg参数值之后不断复用这个函数。

javascript
// 校验
function verify(reg,txt){
  return reg.test(txt)
}
verify(/\d+/g, 'test')       //false
verify(/[a-z]+/g, 'test')    //true

function curryingVerify(reg) {
    return function(txt) {
        return reg.test(txt)
    }
}
let isNumber = curryingVerify(/\d+/g)
let isText = curryingVerify(/[a-z]+/g)
isNumber('test') //false
isText('test') //true

延迟运行

javascript
function curry(fn){
  return function(a){
    return function(b){
      return function(c){
          return fn(a,b,c)
      }
    }
  }
}
function sum(a,b,c){
    return a+b+c
}
let newCurry = curry(sum)
newCurry(1)(2)
// ƒ (c){
// 	return fn(a,b,c)
// }

上面传入多个参数的 sum(1)(2)(3),就是延迟执行的最后例子,传入参数个数没有满足原函数入参个数,都不会立即返回结果,则返回偏函数。