话不多说,直接上代码
/**
* @description 接受一个函数,返回一个新函数,当累计的参数数量等于原函数参数数量时,执行原函数
* @params fn: Function 需要柯里化的函数
* @returns fn: Function 柯里化后的函数
*/
const curried = function (fn, ...args) {
// 这里的params表示柯里化后的函数接受的参数,这个参数的数量是不确定的
return function(...params) {
// 拼接参数,把每次调用函数的参数组合到一起,最终会和原函数一致
const currentArgs = [...args, ...params];
// 当累计的参数数量大于等于原函数参数数量时,执行原函数,小于时保存参数并继续调用柯里化函数
if(currentArgs.length >= fn.length) {
fn.apply(this, currentArgs)
} else {
// currentArgs也在递归调用自身的时候保存所有参数
return curried.call(this, fn, ...currentArgs)
}
}
}
// 测试
const getVal = function(a, b, c, d) {
console.log(a, b, c, d)
}
const curriedFn = curried(getVal);
curriedFn(1, 2)(3)(4) // 1,2,3,4;
个人的一点小见解,要了解一个事物,我们应该要解他的作用和概念,然后用自己话去尝试着描述他的过程,把自己的理解和他的实现一步一步进行对照,最后再尝试自己去实现