Javascript一道面试题

  • 实现一个函数,运算结果可以满足如下预期结果:

add(1)(2) // 3
add(1, 2, 3)(10) // 16

add(1)(2)(3)(4)(5) // 15

function add () {
            var args = Array.prototype.slice.call(arguments);
 
            var fn = function () {
                var arg_fn = Array.prototype.slice.call(arguments);
                return add.apply(null, args.concat(arg_fn));
            }
 
            fn.valueOf = function () {
                return args.reduce(function(a, b) {
                    return a + b;
                })
            }
 
            return fn;
        }

        console.log(add(1));    //1
        console.log(add(1, 2));  //3
        console.log(add(1, 2)(3));  //6
        console.log(add(1)(2)(3)(4)); //10

可以看到,这里其实有一种循环。只有最后一次调用才真正调用到 valueOf,而之前的操作都是合并参数,递归调用本身,由于最后一次调用返回的是一个 fn 函数,所以最终调用了函数的 fn.valueOf,并且利用了 reduce 方法对所有参数求和.

原文地址:https://www.cnblogs.com/meiyh/p/6520118.html