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);

