函数柯里化

在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

文章链接
      // 简单的柯里化
      // const add = x => y => z => x + y + z
      // console.log(add(1)(2)(3))

      // 如果要同时支持下列形式
      // add(1, 2, 3);
      // add(1, 2)(3);
      // add(1)(2, 3);
      // add(1)(2)(3);

      // 需要实现一个工具函数专门来生成 柯里化 函数
      const curry = (fn, ...args) =>
        args.length >= fn.length ? fn(...args) : (..._args) => curry(fn, ...args, ..._args)

      function curryAdd(x, y, z) {
        return x + y + z
      }

      const add = curry(curryAdd)
      console.log(add(1, 2, 3))
      console.log(add(1)(2)(3))
      console.log(add(1, 2)(3))
      console.log(add(1)(2, 3))
    
      // 注释版
      const curryFn = (fn, ...args) =>
        // 函数的参数个数可以直接通过函数数的.length属性来访问
        args.length >= fn.length // 这个判断很关键!!!
          ? // 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
            fn(...args)
          : /**
             * 传入的参数小于原始函数fn的参数个数时
             * 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数)的函数
             */
            (..._args) => curryFn(fn, ...args, ..._args)