在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
以下定义一个接收多个参数的函数,使用柯里化将它,当它接收足够的参数时,就执行函数
const kunkun = (a, b, c, d) => console.log(`kunkun的特长是${a}、${b}、${c}、${d}`)
以下面例子简单手写一个柯里化函数(使用ES6)
// 定义一个currying函数,第一个参数接收一个函数,后面的形参用剩余参数收集
const currying = (fn, ...originArgs) => {
// 返回一个函数,这个函数再次被调用时,形参再次用剩余参数收集
return (...args) => {
// 把每次收集到的形参用展开运算符展开合并到一个新的数组
const totalArgs = [...originArgs, ...args]
// 判断当前收集到的形参数量是否已经达到原函数的参数数量(function.length表示函数形参个数)
if(totalArgs.length < fn.length){
// 如果少于,则返回currying,并把之前收集到的形参带入
return currying(fn, ...totalArgs)
}else{
// 如果已经打到原函数的参数个数,则直接返回原函数
return fn(...totalArgs)
}
}
}
测试一下柯里化后的函数调用是否符合预期
console.log(currying(kunkun)('唱', '跳', 'RAP', '篮球'))
console.log(currying(kunkun)('唱')('跳')('RAP')('篮球'))
console.log(currying(kunkun, '唱', '跳', 'RAP')('篮球'))
console.log(currying(kunkun)('唱')('跳', 'RAP', '篮球'))
// 以上都是打印出:kunkun的特长是唱、跳、RAP、篮球
console.log(currying(kunkun)('唱')('跳', 'RAP'))
console.log(currying(kunkun)('唱')('跳'))
// 以上都是打印出:[Function]
最后附上一段大神的极简currying代码,思路与上面的写法是一样的
var curry = fn =>
judge = (...args) =>
args.length === fn.length
? fn(...args)
: (arg) => judge(...args, arg)