1,什么是函数的柯里化
柯里化(Currying)的理念,是将一个接受多个参数的函数转换成一系列使用一个参数的函数的技术。在js中,柯里化可以创建更灵活、可复用的函数。函数柯里化的关键点在于,函数里面返回函数,从而做到参数复用的目的。
2,函数柯里化的实现
1,简单的柯里化实现
function curryAdd(a) {
return function(b) {
return a + b;
};
}
const addFive = curryAdd(5);
console.log(addFive(3)); // 8
2,通用的柯里化实现
function curry(fn) { // 柯里化函数接受一个函数作为参数
if (fn.length === 0) { // 如果函数不接受任何参数,则直接返回
return fn;
}
return function curried(...args) { // 返回一个新的函数,该函数接受任意数量的参数
if (args.length >= fn.length) { // 如果传入的参数数量大于或等于原函数所需的参数数量
return fn.apply(this, args); // 则调用原函数并传入参数
} else {
return function(...args2) { // 否则,返回一个新的函数,继续接受参数
return curried.apply(this, args.concat(args2)); // 将之前和新传入的参数合并后递归调用
};
}
};
}
// 定义一个原始函数 greet,接受两个参数:name 和 greeting
function greet(name, greeting) {
return `${greeting}, ${name}!`;
}
// 使用 curry 函数对原始函数 greet 进行柯里化
const curriedGreet = curry(greet);
const greetzs = curriedGreet('张三');
console.log(greetzs('李四')); //"李四', 张三!"
3,常见面试题
实现一个函数,使得满足下面的要求:
add(1)(2)(3)(4)//输出10
add(1,2)(3)(4)//也输出10
add(1)(2,3)(4)//也输出10
具体代码
<script>
function add() { // 声明一个 add 函数
let args = Array.prototype.slice.call(arguments) // 将传入的参数转换为数组
console.log(args) // 打印参数数组
let inner = function () { // 声明一个inner闭包函数
args.push(...arguments) // 将传入的参数追加到 args 数组中
return inner // 返回 inner 函数本身,以支持链式调用
}
inner.toString = function () { // 重写 inner 函数的 toString 方法
let sum = args.reduce((prev, cur) => { // 使用 reduce 方法计算 args 数组中元素的总和
return prev + cur
})
return sum.toString() // 将求和结果转换为字符串并返回
}
console.log(inner) // 打印 inner 函数
return inner // 返回 inner 函数
}
let result = add(1)(2)(3)(4)
console.log(parseInt(result))
</script>
总结:函数柯里化是将接受多个参数的函数转换为逐个接受参数并返回新函数的过程,以提高函数的灵活性和复用性。