美文网首页
柯里化函数

柯里化函数

作者: monkeyfly36 | 来源:发表于2020-05-27 11:40 被阅读0次

    // 实现一个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
    }
    

    相关文章

      网友评论

          本文标题:柯里化函数

          本文链接:https://www.haomeiwen.com/subject/ppsfnhtx.html