写在前面

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

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

测试用例:

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

1. 解题方法

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

  1. function add(){
  2. if(arguments.length >= 3){
  3. let sum = 0
  4. for(let i = 0; i < arguments.length; i++){
  5. sum += arguments[i]
  6. }
  7. return sum
  8. }
  9. let last = arguments
  10. return function(){
  11. return add.apply(this, [...last].concat([...arguments]))
  12. }
  13. }

2. 注意要点

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

  1. 调用函数想传递完整的 arguments 时,需要使用 fn.apply(this, […arguemnts])
  2. arguments 不能写在函数形参里,在非箭头函数内部直接获取,若写在了函数形参里就成了函数中第一个参数的变量名了,就只是代表一个形参了。
  3. 返回的函数中也要有返回值,递归函数都要有返回值。