函数柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并返回接受余下参数而且返回结果的新函数。

例如:

//原函数
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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务