高阶函数

什么是高阶函数

高阶函数(Higher-order function)

  • 可以把函数作为参数传递给另一个函数
  • 可以把函数作为另一个函数的返回结果

函数作为参数

在编程过程中会写很多函数,需要测试这些功能函数的运行结果,但是我们并不需要操作dom,可以使用node的环境来进行测试,就不需要创建页面了。
数组中有很多的方法,它们的参数就是一个函数。以下是模拟了数组方法中的forEach和filter作为演示——函数作为参数。
forEach:遍历数组的每一个元素,然后对每一个元素做相应的处理。

//forEach
function forEach(array,fn){
	for(let i=0;i<array.length;i++){
	fn(array[i]);
	}
}

//测试
let arr=[1,3,4,5,8,9];
for Each(arr,function(item)){
console.log(item);
}

filter:过滤数组中满足条件的元素

function filter(array,fn){
	let results=[];
	for(let i=0;i<results.length;i++){
	if(fn(array[i])){
	results.push(array[i]);
	}
	}
	return results;
}

//测试
let arr=[1,3,4,5,8,9];
let r=filter(arr,function(item){
return item%2===0;
})
console.log(r);

函数作为返回值

让一个函数去生成一个函数。

function makeFn(){
	let msg='Hello f';
	return function(){
	console.log(msg);
	}
}

const fn=makeFn();
fn();

//第二种调用
//makeFn()();

once函数:在jquery中的作用是给一个dom元素注册事件,这个事件只会执行一次。
once函数:在loaddash中的作用是对一个函数只执行一次。(支付)
下面模拟loadash中的once函数功能:

//once 确保fn只被执行一次
function once(fn){
	//用done标记fn是否被执行了
	let done=false;
	return function(){
	//判断fn是否被执行
	if(!done){
		done=false;
		return fn.apply(this,arguments);
	}
	}
}

//测试
let pay=once(function (money){
	console.log(`支付:${money} RMB`);
})
//只会执行一次
pay (5);
pay (5);
pay (5);
pay (5);

使用高阶函数的意义

  • 抽象可以帮我们屏蔽细节,只需要关注于我们的目标
  • 高阶函数是用来抽象通用的问题
//面向过程的方式
let array=[1,2,4,6];
for(let i=0;i<array.length;i++){
	console.log(array[i]);
}
//高阶函数
let array=[1,5,3,6];
forEach(array,item=>{
	console.log(item);
})

let r=filter(array,item=>{
	return item%2===0;
})
posted @ 2021-12-27 22:36  flyall  阅读(122)  评论(0)    收藏  举报