梦想照亮现实 发表于 2024-9-10 06:47:45

函数柯里化

函数柯里化

含义:

可以大概理解为: 将fn(a,b,c)转换为fn(a)(b)(c)
原函数:
function sum(a,b){
return a+b
}
console.log(sum(1,2))柯里化后:
    function sum(a) {
      return function (b) {
            return a + b
      }
    }
    console.log(sum(1)(2));.
.
.
面试题

函数sum实现, 接收参数为5个时即实现累加, 满足以下几个要求:
sum(1)(2)(3)(4)(5) //输出15
sum(1)(2,3)(4)(5) //也输出15
sum(1)(2,3,4)(5) //也输出15
sum(1)(2,3)(4,5) //也输出15
.
思路: 保存不定长的参数, 如果数组长度达到5即实现累加, 否则返回函数
使用slice(数组下标前闭后开)截取并浅拷贝返回一个新数组
使用reduce((累加器, 当前值)=>累加器+当前值, 初始值)实现数组累加
let nums = []
    function sum(...args) {
      nums.push(...args)
      if (nums.length >= 5) {
            // 仅累加前5个
            const res = nums.slice(0, 5).reduce((p, v) => p + v, 0)
            nums = []
            return res
      } else {
            return sum
      }
    }.
.
调优: 参数累加的个数可以进行自定义, 这里使用了闭包
    function sumCounter(count) {
      let nums = []
      function sum(...args) {
            nums.push(...args)
            if (nums.length >= count) {
                const res = nums.slice(0, count).reduce((p, v) => p + v, 0)
                nums = []
                return res
            } else {
                return sum
            }
      }
      return sum
    }
.
.
实际应用

参数复用: 为函数预制通用的参数, 供多次重复调用

// // 有如下4个函数
    // function isUndefined(thing) {
    //   return typeof thing === 'undefined'
    // }
    // function isNumber(thing) {
    //   return typeof thing === 'number'
    // }
    // function isString(thing) {
    //   return typeof thing === 'string'
    // }
    // function isFunction(thing) {
    //   return typeof thing === 'function'
    // }

    // 改为通过 typeOfTest 生成:
    const typeOfTest = function (type) {
      // 1. 复用类型判断函数逻辑
      // 2. 动态传入判断的类型
      function isUndefined(thing) {
            return typeof thing === type
      }
      return isUndefined

    }
    const isUndefined = typeOfTest('undefined')
    const isNumber = typeOfTest('number')
    const isString = typeOfTest('string')
    const isFunction = typeOfTest('function')

    // 可以通过 isUndefined,isNumber,isString,isFunction 来判断类型:

    isUndefined(undefined) // true
    isNumber('123') // false
    isString('memeda') // true
    isFunction(() => { }) // true可以简化修改为:
const typeOfTest = type => thing => typeof thing === type
来源:https://www.cnblogs.com/mandyGuan12/p/18405046
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 函数柯里化