什么是高阶函数
高阶函数(Higher-order function)
-可以把函数做为参数传给另一个函数。
-可以把函数做为另一个函数的返回结果。
一、把函数做为参数传给另一个函数。模拟forEach
function forEach(array, fn) {
for (let i = 0; i < array.length; i++) {
fn(array[i]);
}
}
//测试
let arr = [1, 2, 3, 4];
forEach(arr, function(item) {
console.log(item)
})
再来一个例子加深一下印象,模拟filter。
function filter(array, fn) {
let results = [];
for (let i = 0; i < array.length; i++) {
if (fn(array[i])) {
results.push(i);
}
}
return results;
}
//测试
let arr = [1, 2, 3, 4];
filter(arr, function(item) {
return item % 2 === 0;
})
二、把函数做成另一个函数的返回结果。
首先我们来模仿个once函数,只可被调用一次。
function once(fn) {
let done = false;
return function() {
if (!done) {
done = true;
return fn.apply(this,arguments);
}
}
}
//测试
let pay=once(function(money){
console.log(`支付:${money}元`)
})
pay(5);
pay(5);
pay(5);
上面例子不管pay被调用了多少次,只有第一次有效。
高阶函数的意义
说了这么多高阶函数到底有哪些意义呢?
一、抽象可以帮我们蒙蔽细节,只需要关注我们的目标。
二、高阶函数是用来抽象通用的问题
常用的高阶函数有:
- forEach
- map
- filter
- every
- some
- find/findIndex
- reduce
- sort
- …
最后再给大家模拟两个常用的高阶函数
模拟map
const map = (array, fn) => {
let results = [];
for (let value of array) {
results.push(fn(value));
}
return results
}
//测试
let arr = [1, 2, 3, 4];
arr = map(arr, v => v * v);
console.log(arr);
模拟every
const every = (array, fn) => {
let result = true;
for (let value of array) {
result = fn(value);
if (!result) {
break
}
}
return result
}
//测试
let arr = [11, 12, 14];
let r = every(arr, v => v > 10);
console.log(r)