第36题 实现一个柯里化函数

预先处理的思想,利用闭包的机制

  • 柯里化的定义:接收一部分参数,返回一个函数接收剩余参数,接收足够参数后,执行原函数。
  • 函数柯里化的主要作用和特点就是参数复用提前返回延迟执行
  • 柯里化把多次传入的参数合并,柯里化是一个高阶函数
  • 每次都返回一个新函数
  • 每次入参都是一个
    // 分批传入参数
    // redux 源码的compose也是用了类似柯里化的操作
    const curry = (fn, arr = []) => {// arr就是我们要收集每次调用时传入的参数
      let len = fn.length; // 函数的长度,就是参数的个数
    
      return function(...args) {
        let newArgs = [...arr, ...args] // 收集每次传入的参数
    
        // 如果传入的参数个数等于我们指定的函数参数个数,就执行指定的真正函数
        if(newArgs.length === len) {
          return fn(...newArgs)
        } else {
          // 递归收集参数
          return curry(fn, newArgs)
        }
      }
    }

简洁写法

    const curry = (fn, arr = []) => (...args) =>
      ((arg) => (arg.length === fn.length ? fn(...arg) : curry(fn, arg)))([
        ...arr,
        ...args,
      ]);
    // 柯里化求值
    // 指定的函数
    function sum(a,b,c,d,e) {
      return a + b + c + d + e
    }
    
    // 传入指定的函数,执行一次
    let newSum = curry(sum)
    
    // 柯里化 每次入参都是一个参数
    newSum(1)(2)(3)(4)(5)
    
    // 偏函数
    newSum(1)(2)(3,4,5)
    // 柯里化简单应用
    // 判断类型,参数多少个,就执行多少次收集
    function isType(type, val) {
      return Object.prototype.toString.call(val) === `[object ${type}]`
    }
    
    let newType = curry(isType)
    
    // 相当于把函数参数一个个传了,把第一次先缓存起来
    let isString = newType('String')
    let isNumber = newType('Number')
    
    isString('hello world')
    isNumber(999)
Last Updated:
Contributors: leeguooooo