函数柯里化

函数柯里化

含义:

可以大概理解为: 将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
作者:番茄仔Mandy原文地址:https://www.cnblogs.com/mandyGuan12/p/18405046

%s 个评论

要回复文章请先登录注册