首先了解函数柯里化的概念:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术;
初读不知句中意?那就用代码演示;
首先就是要有接收多个参数的函数;
function fn() {
let arr = Array.prototype.slice.call(arguments);
let result = arr.reduce((pre, a) => {
return pre += a;
}, 0)
return result;
}
console.log(fn(1, 2, 3, 4, 5));
上面就是一个接收多个参数的函数;
紧接着概念往下--变成接收一个单一参数的函数;
也就是将fn(1,2,3,4,5)--变成fn(1) 函数这种每次只接受一个参数的形式;但是概念后面还有-最后一句话:这个单一参数的函数(fn(1))能返回接收余下参数(就是相比较fn(1,2,3,4,5)fn(1)还要把剩下的参数都以它(fn(x))这种形式接受);且返回结果的新函数的技术--这里的返回结果就是函数对这些参数要进行处理的结果(也就是我们定义这个函数的功能);
在fn(1,2,3,4,5)函数中他的功能就是把参数进行相加,让后记性返回;
函数柯里化就是把fn(1,2,3,4,5)这种形式变成 以fn(1)fn(2)fn(3)fn(4)fn(5)这种形式接受参数;来实现fn(1,2,3,4,5)函数的功能;
进行代码演示:
function curry() {
let arr = Array.prototype.slice.call(arguments); //接受一个参数;
return function result() { //返回一个函数--作用是用来接收第二个参数;
arr.push(...arguments);
return arr.reduce((pre, ele) => {
return pre += ele;
}, 0)
}
}
console.log(curry(1)(2));//3
我们用一个函数只接受一个参数;但是我们又返回一个函数,用来接收剩下的另外一个参数;我们定义数组arr的意义就是拼接接受来的参数;---上面的例子中我们只能接受连个参数,以为我们在接收第二个参数后返回的是一个运算的结果,如果想要继续接受参数,就返回result这个函数本身;
代码展示:
function curry() {
let arr = Array.prototype.slice.call(arguments);
return function result() {
arr.push(...arguments);
return result;
}
}
console.log(curry(1)(2));
它的返回结果是什么?---当然是一个result函数了;
写到这我们干了什么?------只是将参数拼接到了一个数组中了;
验证一下:
function curry() {
let arr = Array.prototype.slice.call(arguments);
return function result() {
arr.push(...arguments);
console.log(arr);
return result;
}
}
console.log(curry(1)(2));
console.log(curry(1)(2)(3)(4));
从运行结果就能看出我们只是保留了所有输入的参数值;并且它函数执行返回的就是一个保存了所有参数的的函数;如果我们想要对返回的函数进行执行,肯定是在返回的函数后添加();所以我们可以在result函数中添加判断来确认函数的功能什么时候执行并返回执行的结果;
我们判断的依据就是不传入参数;----代码演示
function curry() {
let arr = Array.prototype.slice.call(arguments);
return function result() {
if (arguments.length == 0) { //当不传参数就意味着要执行函数了;
let res = arr.reduce((pre, ele) => {
return pre += ele;
}, 0);
return res;
} else {
arr.push(...arguments);
return result;
}
}
}
console.log(curry(1)(2)());//3
console.log(curry(1)(2)(3)(4)());//10
这样就能实现函数的柯里化了;