函数柯里化
柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并返回接受余下参数而且返回结果的新函数。
例如:
//原函数
function sum(a,b){
return a+b
}
sum(1,2)
//改写结果
//1.定义接收一个参数的函数
function sum(a){
//2.内部返回一个接收剩余参数的新函数,返回累加结果
return function(b){
return a+b
}
}
//该写sum可以实现如下效果
sum(1)(2)
function sum(a,b,c){
return a+b+c
}
sum(1,2,3)//6
//该写结果
function sum(a){
return function(b){
return function(c){
return a+b+c
}
}
}
sum(1)(2)(3) //6
面试题
function sum(a,b,c,d,e){
return a+b+c+d+e
}
//改写函数sum实现,参数传递到5个即可实现累加
//sum(1)(2)(3)(4)(5)
//sum(1)(2,3)(4)(5)
//sum(1)(2,3,4)(5)
//sum(1,2,3)(4,5)
//1.保存不定长参数
let nums=[]
function sum(...args) {
nums.push(...args)
//2.判断参数个数
if(nums.length>=5){
//2.1长度到5累加
nums.slice(0,5).reduce((p,v)=>p+v,0)
//累加之后需要清空数组,保证下次累加的值是正确的
nums=[]
return res
}else{
//2.2长度没到5返回函数接收剩余参数
return sum
}
}
为了使代码变得更加通用,我们需要将参数的个数可以自定义
function sumMaker(length){
let nums=[]
function sum(...args){
nums.push(...args)
if(nums.length>=length){
const res=nums.slice(0,length).reduce((p,v)=>p+v,0)
nums=[]
return res
}else{
return sum
}
}
return sum
}
实际应用.例如判断参数是什么类型
function isUndefind(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){
function isUndefind(thing){
return typeof thing === type
}
return isUndefind
}
//最简写法
const typeofTest=type=>thing=>typeof thing===type

