1.什么是高阶函数
- 可以把函数作为参数传递给另一个函数
- 可以把函数作为另一个函数的返回结果
2.函数作为参数
```javascript // 函数作为参数 示例 // forEach 遍历 function forEach(arr, fn) { for (let i = 0; i < arr.length; i++) {
} } // 测试数组 let arr = [1, 2, 3, 4, 56, 8, 9, 71]; // forEach应用 // forEach(arr,function(value){ // console.log(value); // })fn(arr[i]); // fn 则是作为参数的方法
// filter 过滤数组 function filter(arr, fn) { let results = []; for (let i = 0; i < arr.length; i++) { if (fn(arr[i])) {// fn 则是作为参数的方法 results.push(arr[i]); } } return results; }
// filter 应用 let f = filter(arr, function (value) { return value % 2 === 0; }) console.log(f);
<a name="zcbHr"></a>
## 3.函数作为返回值
```javascript
// 返回函数
function makeFn(){
let msg = 'Hello function'
return function(){ // 返回了一个函数
console.log(msg);
}
}
// 调用返回的那个函数
// 第一种方式
const fn = makeFn()
fn();
// 第二种方式
makeFn()();
// 模拟once(内部的函数只执行一次)
function once(fn){
let done = false;
return function(){
if(!done){
done = true;
// apply 用于给方法传参
// arguments 对应于传递给函数的参数的类数组对象
// arguments 当前是指获取传递给fn的参数
return fn.apply(this,arguments)
}
}
}
// 应用
let pay = once(function(money){
console.log(`支付:${money} RMB`);
})
// 执行 这里可以看到 不管调用多少次 内部的方法只执行一次
pay(5)
pay(5)
pay(5)
pay(5)
4.意义
- 抽象可以帮我们屏蔽细节,只需要关注与我们的目标
- 高阶函数是用来抽象通用的问题
- 好处:
// 测试数组 let arr = [1, 2, 3, 4, 56, 8, 9, 71]; //forEach应用 forEach(arr,function(value){ console.log(value); })
```javascript
// -----------------filter 过滤数组-----------------
function filter(arr, fn) {
let results = [];
for (let i = 0; i < arr.length; i++) {
if (fn(arr[i])) {// fn 则是作为参数的方法
results.push(arr[i]);
}
}
return results;
}
// 测试数组
let arr = [1, 2, 3, 4, 56, 8, 9, 71];
// filter 应用
let f = filter(arr, function (value) {
return value % 2 === 0;
})
console.log(f);
// -----------------map 根据规则统一修改数组内的值-----------------
const map = (arr, fn) => {
let results = [];
for (let value of arr) {
results.push(fn(value));
}
return results;
}
// 测试
let arr = [1, 2, 3, 4]
arr = map(arr, v => v * v)
console.log(arr);
// -----------------every 数组是否全部满足条件-----------------
const every = (arr, fn) => {
let result = true;
for (const value of arr) {
result = fn(value)
if (!result) {
break
}
}
return result;
}
// 测试
let arr = [1,2,3,3]
let e = every(arr,v => v <= 3)
console.log(e);
// -----------------some 数组中是否有满足条件的元素-----------------
const some = (arr, fn) => {
let result = false;
for (const value of arr) {
result = fn(value)
if (result) {
break
}
}
return result;
}
// 测试
let arr = [1,2,2,2]
let e = some(arr,v => v >= 3)
console.log(e);