函数的实参形参个数怎么算?
分为以两种情况确定:
当函数形参个数确定的时候:
function sum(a,b,c){
console.log(a+b+c);
}
实现sum(1,2,3)==sum(1)(2)(3);
function curry(fn) {
return function curryFn(...args) {
if (args.length < fn.length) {
//args.length:当前执行函数传入的实参的个数;
//fn.length:函数sum形参确定,fn.length的值为形参的个数;此处为3
//只要满足条件,递归返回函数
return function(...argss) {
//这里的argss是返回函数时的参数
return curryFn(...args.concat(argss));
}
}
return fn(...args);
}
}
var mySum = curry(sum);
mySum(1,2,3):
实参为(1,2,3),即实参个数为3==sum函数的形参个数3;不进入条件,直接执行sum(1,2,3);
mySum(1)(2)(3):
第一次实参为1,实参个数1<sum函数的形参个数3,进入条件,curryFn(1,2);
第二次实参为1,2,实参个数2<sum函数的形参个数3,进入条件,curryFn(1,2,3);
第三次实参为1,2,3,实参个数3==sum函数的形参个数3,不进入条件,执行fesum(1,2,3);
2.当函数形参个数不确定的时候
计算以下结果
sumAdd(1,2,3)
sumAdd(1)(2,3)(4)
sumAdd(1,2)(3)(4)(5)
由于参数不确定,就要一直返回函数,返回函数内部定义了一个函数对象(我管这叫函数对象),
将每次函数执行获取的参数保存到函数对象中并返回函数对象,然后给函数对象扩展一个计算结果的方法即可。
function sumAdd(...args){
function currySum(){
//定义函数对象
function mySum(...argss){
//这一步即是将每次函数执行的参数保存下来
args = args.concat(argss);
return mySum;
}
mySum.getResult = function(){
//这一步即是将保存的参数进行结果计算
return args.reduce((a,b)=>{
return a+b;
})
}
return mySum;//最终返回的函数对象
}
return currySum();//返回函数
}
形似sumAdd(1)(2,3)(4)这种得到的结果都是mySum函数对象,要得到计算结果还得调用getResult();
有几对括号就返回函数几次。
console.log(sumAdd(1,2,3).getResult());
返回函数一次,然后调用getResult;
console.log(sumAdd(1)(2,3)(4).getResult());
返回函数三次,然后调用getResult;
console.log(sumAdd(1,2)(3)(4)(5).getResult());
返回函数四次,然后调用getResult。