柯里化函数

2020-05-27  本文已影响0人  monkeyfly36

// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;

A:理解版

// 柯里化函数
const curring = (fn) => {
  let _args = []
  return function cb(){
    // arguments.length === 0 当不传参数时进行计算 --> 最后一步执行,只执行一次
    if (arguments.length === 0) return fn.apply(this, _args)
    // arguments.length !== 0 精髓:用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数
    _args = [..._args, ...arguments]
    return cb
  }
}
// 求和计算
const multi = (...args) => {
  return args.reduce((a, b) => {
    return a + b
  })
}
// 函数声明变量
const calc = curring(multi)
console.log(calc(1,2)(3)(4,5,6)())

B:通用版

var add = function() {
  // 第一次执行时,定义一个数组专门用来存储所有的参数
  var _args = [...arguments]
  // 精髓1: 利用闭包的特性保存_args并收集所有的参数值
  const _adder = function() {
      _args =  [..._args, ...arguments]
      return _adder
  }
  // 精髓2: 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
  _adder.toString = function () {
    return _args.reduce((a, b) => {
        return a + b
    })
  }
  return _adder
}

C:极简版

var add = (...args) => {
  // 精髓: 将args作为闭包变量, 收集所有参数
  let _adder = (..._args) => {
    args = [...args, ..._args]
    return _adder
  }
  _adder.toString = () => args.reduce((a, b) => a + b)
  return _adder
}
上一篇下一篇

猜你喜欢

热点阅读