/**
* 实现函数的柯里化
* 允许将一个接受多个参数的函数,转换为一系列接受单个参数的函数,以便于函数的复用和参数的灵活传递
*
* @param {Function} fn - 要柯里化的目标函数
* @param {...any} bindArgs - 目标函数的前置参数
* @returns {Function} - 返回一个新的柯里化后的函数,可以通过连续传递参数的方式来调用目标函数
*
* 使用示例:
*
* const add = (a, b, c) => a + b + c
* const curryAdd = currying(add, 1)
* console.log(curryAdd(2)(3))
* // 输出结果:6(即 1 + 2 + 3)
*
*/
function currying(fn,...bindArgs) {
return (...args) => {
const allArgs = [...bindArgs,...args];
// 当所有参数都传递完成后,调用目标函数
// 否则,继续柯里化
if (allArgs.length >= fn.length) {
return fn(...allArgs);
} else {
return currying(fn,...allArgs);
}
};
}
// 测试示例
const add = (a,b,c) => a + b + c
const addCurrying = currying(add, 1)(2)(3)
console.log(addCurrying) // 输出结果:6(即 1 + 2 + 3)