翼度科技»论坛 编程开发 JavaScript 查看内容

函数柯里化

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
函数柯里化

含义:

可以大概理解为: 将fn(a,b,c)转换为fn(a)(b)(c)
原函数:
  1. function sum(a,b){
  2.   return a+b
  3. }
  4. console.log(sum(1,2))
复制代码
柯里化后:
  1.     function sum(a) {
  2.         return function (b) {
  3.             return a + b
  4.         }
  5.     }
  6.     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((累加器, 当前值)=>累加器+当前值, 初始值)实现数组累加
  1. let nums = []
  2.     function sum(...args) {
  3.         nums.push(...args)
  4.         if (nums.length >= 5) {
  5.             // 仅累加前5个
  6.             const res = nums.slice(0, 5).reduce((p, v) => p + v, 0)
  7.             nums = []
  8.             return res
  9.         } else {
  10.             return sum
  11.         }
  12.     }
复制代码
.
.
调优: 参数累加的个数可以进行自定义, 这里使用了闭包
  1.     function sumCounter(count) {
  2.         let nums = []
  3.         function sum(...args) {
  4.             nums.push(...args)
  5.             if (nums.length >= count) {
  6.                 const res = nums.slice(0, count).reduce((p, v) => p + v, 0)
  7.                 nums = []
  8.                 return res
  9.             } else {
  10.                 return sum
  11.             }
  12.         }
  13.         return sum
  14.     }
复制代码

.
.
实际应用

参数复用: 为函数预制通用的参数, 供多次重复调用
  1. // // 有如下4个函数
  2.     // function isUndefined(thing) {
  3.     //     return typeof thing === 'undefined'
  4.     // }
  5.     // function isNumber(thing) {
  6.     //     return typeof thing === 'number'
  7.     // }
  8.     // function isString(thing) {
  9.     //     return typeof thing === 'string'
  10.     // }
  11.     // function isFunction(thing) {
  12.     //     return typeof thing === 'function'
  13.     // }
  14.     // 改为通过 typeOfTest 生成:
  15.     const typeOfTest = function (type) {
  16.         // 1. 复用类型判断函数逻辑
  17.         // 2. 动态传入判断的类型
  18.         function isUndefined(thing) {
  19.             return typeof thing === type
  20.         }
  21.         return isUndefined
  22.     }
  23.     const isUndefined = typeOfTest('undefined')
  24.     const isNumber = typeOfTest('number')
  25.     const isString = typeOfTest('string')
  26.     const isFunction = typeOfTest('function')
  27.     // 可以通过 isUndefined,isNumber,isString,isFunction 来判断类型:
  28.     isUndefined(undefined) // true
  29.     isNumber('123') // false
  30.     isString('memeda') // true
  31.     isFunction(() => { }) // true
复制代码
可以简化修改为:
  1. const typeOfTest = type => thing => typeof thing === type
复制代码
来源:https://www.cnblogs.com/mandyGuan12/p/18405046
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具