高阶函数与函数柯里化

这两天复习了一下数组的map、filter等方法,后面又重新了解了一下高阶函数、函数柯里化,这里简单记录一下

高阶函数在我看来就是一个函数可以接受另一个函数作为参数,又把函数作为返回值输出,这样的函数就是高阶函数,就是用一个函数来控制函数。
在这里插入图片描述
举个例子:定义一个函数fnsum求两个数的和

function fnsum(a,b){
	return a,b;
}

但是我像求这两个数绝对值的和,我可以直接在函数fnsum的里面处理,还有一种方法就是利用到高阶函数了

function fnsum(a,b,fn){
	return fn(a)+fn(b);
}
fnsum(3,-3,Math.abs) //结果为6

还有就是map函数,它也是高阶函数,作用是遍历数组,并且返回一个新的数组,新的数组里的每一个元素都执行map传入的函数

arr = [1,2,3].map(fn)
console.log(arr2)
function fn(x){
	retrun x*x
}

这里返回了一个新数组arr,原数组没有变动,所以使用map高阶函数不会对原来的数组造成影响。

函数柯里化

第一次看到柯里化这个词的时候,觉得它很高端,但实际了解以后才发现其实就是高阶函数的一个特殊用法。

按我的理解其实就是本来函数要传多个参数,现在只传递给函数一部分参数来调用它,让他返回一个函数来处理剩余的参数,但我想了很长时间没搞懂,为什么费了这么大劲封装一层,有什么用呢?
所以更深入的了解了下柯里化

function add(a,b,c,d){
			return a+b+c+d;
		}
		console.log(add.length)


		//固定参数的柯里化
		function fixedparamscurry(fn){
			// 可能传递的参数要收集
			// arguments
			var _arg = [].slice.call(arguments , 1);
			return function(){
				// _arg = [10,20]
				var newArg = _arg.concat( Array.prototype.slice.call(arguments , 0) );
				return fn.apply(this , newArg)
			}

		}

		// var newAdd = fixedparamscurry(add,10,20);
		// // 期待...
		// console.log( newAdd(30,40) )



		function curry(fn,length){
			var length = length || fn.length;   //直接就可以判断出函数有几个形参

			return function(){
				if(arguments.length < length){   //参数没有传递完成
					var arr = [fn].concat( Array.prototype.slice.call(arguments , 0) )
					return curry( fixedparamscurry.apply(this,arr) , length - arguments.length )
				}else{   //传递完成了以后
					return fn.apply(this , arguments)
				}
			}
		}


		var newAdd = curry(add);
		console.log(newAdd(10)()()()(20)(30)()()(74))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值