在函数式编程中,函数是一等公民。那么函数柯里化是怎样的呢?
函数柯里化指的是将能够接收多个参数的函数转化为接收单一参数的函数,并且返回接收余下参数且返回结果的新函数的技术。
函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。
在一个函数中,首先填充几个参数,然后再返回一个新的函数的技术,称为函数的柯里化。通常可用于在不侵入函数的前提下,为函数 预置通用参数,供多次重复调用。
function add(n) {
let sum = n;
function temp(n) {
sum += n;
return temp;
}
temp.toString = function () {
return sum;
}
return temp;
}
let result = add(1)(2)(3)
let result1 = add(1)(2)(3)(4)
console.log(result.toString(), result1.toString())
function add(){
//let args = arguments;//用于获取第一个括号里的参数
// 因为arguments是类数组结构,因此上述代码还需要进行改进,下面这行才是正确的
let args = Array.prototype.slice.call(arguments);
let inner = function(){
args.push(...arguments);// arguments默认就为函数的参数,即使我们没有列出形参
return inner;
}
inner.toString = function(){
return args.reduce((prev,cur) => {
return prev + cur;
});
}
return inner;
}
console.log(add(1)(5)(8).toString())
function carry(fn, ...args) {
//传入的参数个数 (args.length) 是否大于等于原函数所需参数个数 (fn.length) ,如果是,则执行当前函数;否则返回一个函数
if (args.length >= fn.length) {
return fn(...args);
} else {
return function (..._args) {
return carry(fn, ..._args, ...args)
};
}
}
function add1(x, y, z) {
return x + y + z;
}
let add = carry(add1);
console.log(add(1, 2, 3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));