高阶函数
什么是高阶函数
高阶函数(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;
})

浙公网安备 33010602011771号