实现 add(1,2,3) == 6, add(1,2,3)() = 6, add(1)(2)(3) = 6, add(1)(2)(3)() = 6
add(1, 2, 3, ...)是对传入参数的求和方法
function add (...args) { return args.reduce((prev, val) => { return prev + val }) } let rs = add(1, 2, 3, 4, 5, 6) console.log(rs) // 21
add(1)(2)(3)是一个无限累加的函数add方法,都是将函数作为返回值输出,然后接收新的参数并进行计算。
function add (a) { var temp=function(b) { // 使用闭包 a = a + b; // 累加 return temp; } temp.toString = function() { // 重写toSting() 方法 return a; } return temp; // 返回一个函数 } console.log(add(1)(3)) // f 4 console.log(add(1)(3)(5)) // f 9
综合写法
function add () { let res = [...arguments].reduce((a, b)=>{ return a+b; }, 0); let temp=function() { // 使用闭包 if(arguments.length){ res+=[...arguments].reduce((a, b)=>{ return a+b; }, 0); // 累加 return temp; }
else{ return res; } }
temp.toString = function() { // 重写toSting() 方法 return res; }
return temp; // 返回一个函数 } console.log(add(1,2,3)()) //6 console.log(add(1,2,3)) //f 6 console.log(add(1)(3)) // f 4 console.log(add(1)(3)(5)()) //9
实现 add(1)(2)(3)().res = 6, add(1,2)(3)().res = 6
function add(){ let res = [...arguments].reduce((a, b)=>{ return a+b; }, 0); let obj = {res: res}; let innerAdd = function(){ if(arguments.length===0){ return obj; }else{ res += [...arguments].slice(1).reduce((a, b)=>{ return a+b; }, 0); obj.res = res; return innerAdd; } } innerAdd.toString = function(){ return res; } innerAdd.toValue = function(){ return res; } return innerAdd; }
浙公网安备 33010602011771号