链式 add 函数

写在前面

这是面试中问到的一个问题,明明很简单的递归,但是有些细节没做到,就思路是对的,但具体没实现成,因此,结束后又完善并实现了。

问题如下

实现一个链式 add 函数,当其接收的参数个数大于等于 3 个的时候,就返回其结果,如果接收的参数不够 3 个时,就返回函数再次继续接收参数。

测试用例:

add(2,3,4)  =>  9
add(2)(3,4) =>  9
add(2)(3)(4)  =>  9
add(2,3)(4,5)  =>  14

1. 解题方法

解决思路就是以参数的长度大于等于 3 为出口,当参数长度不足 3 时就返回一个函数,在该函数内再次调用 add 函数,调用的时候将之前的参数传递过去

function add(){
    if(arguments.length >= 3){
        let sum = 0
        for(let i = 0; i < arguments.length; i++){
            sum += arguments[i]
        }
        return sum
    }
    let last = arguments
    return function(){
        return add.apply(this, [...last].concat([...arguments]))
    }
}

2. 注意要点

当时之所有没有实现出来有如下几点细节没有注意到:

  1. 调用函数想传递完整的 arguments 时,需要使用 fn.apply(this, [...arguemnts])

  2. arguments 不能写在函数形参里,在非箭头函数内部直接获取,若写在了函数形参里就成了函数中第一个参数的变量名了,就只是代表一个形参了。

  3. 返回的函数中也要有返回值,递归函数都要有返回值。

原文地址:https://www.cnblogs.com/lovevin/p/13622204.html