浏览网页时,突然看到这样一道题,实现add(1)(2)(3)(4)=10这样的效果。
一般来说 fn()()这样的格式是会报错的,要想这个函数能执行 add()(),可以很快的想到当add()返回一个函数时,可以达到这样的效果。
1 function add(){ 2 3 function temp(){} 4 5 return temp; 6 }
然后返回tmp保证了第二次调用的是tmp函数,后面的计算都是在调用tmp, 因为tmp也是返回的自己,保证了第二次之后的调用也是调用tmp,而在tmp中将传入的参数与保存在作用链中x相加并付给sum,这样就保证了计算;
1 function add(x){ 2 var sum=x; 3 function temp(y){ 4 console.log("y:"+y); 5 sum+=y; 6 console.log(sum) 7 8 } 9 return temp; 10 }
这样返回temp的话就不能够获取到sum的数值了,而我们又知道,当打印时,会调用他的tostring或valueof 方法 ,因此我们可以自己改写它的tostring方法,从而获得sum值
1 function add(x){ 2 var sum=x; 3 function temp(y){ 4 console.log("y:"+y); 5 sum+=y; 6 return temp; 7 } 8 temp.toString=function(){ 9 return sum; 10 } 11 return temp; 12 }
这时候就可以实现add()()()这样不限制参数个数的效果了,如果想实现add()不定项参数的话,可以考虑用arguments计算出add()的值 再计算后面括号的值