无限调用函数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);
posted @ 2019-08-30 10:23  =.=  阅读(618)  评论(0编辑  收藏  举报