一道关于连续调用的思维扩展题

147 阅读1分钟

题目:

    add(1)(2)(3) = 6 
    add(1,2,3)(4) = 10
    add(1)(2)(3)(4)(5) = 15
//  定义一个sum函数
    function sum() {
    
    // 创建一个数组保存第一次传进来的参数
    let arr = Array.from(arguments)

    // 定义一个函数,sum函数执行完后返回,确保可以第二次使用小括号调用
    const execute = function () {
      arr.push(...arguments)
      
      // 函数中回调,确保可以连续调用
      return execute
    }
    
    // 因为execute函数中已经return所以我们利用execute在输出时会调用toString,
    //然后对toString进行替换,返回累加和
    execute.toString = function () {
      const res = arr.reduce((a, b) => {
        return a + b
      })
      return res
    }
    return execute
  }

  // 因为最后的结果是一个函数,所以要进行转换
  const res1 = +sum(1)(2)(3)
  const res2 = +sum(1, 2, 3)(4)
  const res3 = +sum(1)(2)(3)(4)(5)
  console.log(res1)
  console.log(res2)
  console.log(res3)