JavaScript中的"柯里化"(Currying)是一种函数式编程的技术,它允许你将一个接受多个参数的函数转化为一系列接受单个参数的函数。这种技术使得函数更加灵活,可以更容易地进行组合和重用。
通过柯里化,你可以部分应用函数的参数,创建一个新的函数,以便在稍后传递剩余的参数。这有助于参数的重复使用、延迟执行和提高函数的灵活性。
简单的说,函数柯里化就是,能够使我们在使用函数的时候可以分多次传入该函数的参数,而不一定要一次传入所有的参数
currying有很多种,这里介绍一种优雅的写法:
function add(a,b,c){
return a + b + c;
}
//函数的柯里化
function curry(fn){
let judge =(...args) =>{
if(args.length==fn.length)return fn(...args);
return (...arg2) =>judge(...args,...arg2)
}
return judge
}
console.log(add.length);
const curryAdd = curry(add)
console.log(curryAdd(1)(2)(3));//输出6
在上述代码中我们定义一个普通函数add用于三数相加计算,需要传入三个参数;
接着定义curry函数,curry接收一个传入参数(类型是函数)fn,在curry函数中定义一个函数judge并返回形成闭包;
judge 函数被返回形成闭包被保存在内存栈中,通过使用(...args)来接受参数,这是一种在函数中处理不定数量参数的方式。如果当传入的参数总数args.length和fn需要的参数个数fn.length相等时,就顺利执行add函数,否则执行返回一个箭头函数,这个箭头函数将递归调用judge并传入接受到的新参数和原来已有的参数
之后我们将add函数currying得到新的curryAdd,就可以实现原add函数调用时分多次传值
总结
函数柯里化实现原理不难
但在面试当中也经常考察自己定义curry函数,所以需要熟悉理解curry函数实现的原理