无限调用函数add(1)(2)(3)......
无限调用函数,并且累计结果
其实这也算一道面试题吧,笔者曾经被提问过,可惜当时没能答上来。。。 💔 现在来研究一下吧。
解析
这个问题有两个重点,一是无限调用;二是累计结果。首先,累计结果比较简单,用闭包实现即可。难点在于无限调用。
关于无限调用,一开始是想重复调用函数自身,但是在什么时候停止呢?想了许久没找到合适的点;后来转了一下思路,还是重复返回函数自身,通过改写.toString方法来返回累计结果。
//实现一个累加的函数
var add = (function(){
var total = 0;
function _add(){
if(arguments[0]){
total += arguments[0];
return _add;
}
}
//关键
_add.toString = function(){
var result = total;
total = 0;
return result;
};
return _add;
})()
add(1)(2)(3) //6
改一下题目,如果不是要无限调用,而是把参数改成分多次调用,比如add(1,2,3)改成add(1)(2)(3),如何解决?
这个相对简单了,其实就是函数柯里化。
函数柯里化:把接受多个参数的函数改成接受单一参数的函数,并且返回接受剩余参数及返回结果的新函数
function curry(fn,...args){
return args.length<fn.length? (...arguments)=>curry(fn,...args,...arguments) : fn(...args)
}
//test
function add(a,b,c){
return a+b+c;
}
var add1 = curry(add);
add1(1)(2)(3);