理解高阶函数
高阶函数是一个非常基本的概念(也非常重要),但也有点被误解。
让我们首先了解这个概念,最清晰的定义,简单直接,你可能在一些技术面试中用到它。
什么是高阶函数?(又称 HOF)
高阶函数是所有接受其他函数作为参数和/或返回一个函数的函数。
在进行更深入的解释之前,我们可以列出一些有关编程中 HOF 的重要事项。
- 使我们的代码更具声明性且易于阅读。
- 它是编程中更复杂概念的关键概念,例如闭包、柯里化、承诺等。
- 我们可以概括函数,以便在必要时以不同的方式重复使用它们。
理解高阶函数
请参阅下面的代码:
function copyArrayAndMultiplyBy5(array) {
const output = [];
for (let i = 0; i < array.length; i++) {
output.push(array[i] * 5);
}
return output;
}
const myArray = [1,2,3];
const result = copyArrayAndMultiplyBy5(myArray);
假设我们现在想做一个 3、4 的乘法函数
,或者加法或除法。我们需要复制粘贴各种函数,只需更改名称,将值从 5 改为 3、4,并将运算符从 * 改为 + 和 /。
并且,如果我们不在声明时刻定义函数的所有行为,那么我们是否可以定义一个参数来接收另一个函数作为参数,并让行为执行?
在 Javascript 中,函数是对象,称为第一类对象。
如果我们可以将对象作为参数传递给一个函数,那么我们也可以传递另一个函数。
让我们编辑一下代码。
function copyArrayAndManipulate(array, fn) {
const output = [];
for (let i = 0; i < array.length; i++) {
output.push(fn(array[i]));
}
return output;
}
现在我们创建一个通用函数copyArrayAndManipulate,它接收数组 e 作为参数,即一个名为fn的函数。
我们不知道您声明时函数的所有行为,而且我们也不需要知道。
函数copyArrayAndManipulate是我们的高阶函数,而我们将传入参数的函数fn是我们的回调函数。
现在我们可以以更简单、更动态的方式创建变体,而无需复制和粘贴不必要的代码。
function copyArrayAndManipulate(array, fn) {
const output = [];
for (let i = 0; i < array.length; i++) {
output.push(fn(array[i]));
}
return output;
}
function multiplyBy5(input) {
return input * 5;
}
function multiplyBy3(input) {
return input * 3;
}
function multiplyBy4(input) {
return input * 4;
}
const result1 = copyArrayAndManipulate([1, 2, 3], multiplyBy5);
const result2 = copyArrayAndManipulate([1, 2, 3], multiplyBy3);
const result3 = copyArrayAndManipulate([1, 2, 3], multiplyBy4);
我们的代码保持了更强的声明性和易读性,因为在阅读时我们确切地知道 result1 的值将是数组 [1, 2, 3] 的副本乘以 5。
好的,这已经改善了我们的代码编写,避免了不必要的代码,但我们可以使用箭头函数让其更加美观。
function copyArrayAndManipulate(array, fn) {
const output = [];
for (let i = 0; i < array.length; i++) {
output.push(fn(array[i]));
}
return output;
}
const multiplyBy5 = (input) => input * 5;
const multiplyBy3 = (input) => input * 3;
const multiplyBy4 = (input) => input * 4;
const result1 = copyArrayAndManipulate([1, 2, 3], multiplyBy5);
const result2 = copyArrayAndManipulate([1, 2, 3], multiplyBy3);
const result3 = copyArrayAndManipulate([1, 2, 3], multiplyBy4);
好多了。但我们不需要把函数存储在常量中,可以直接传递它们。这给了我们更多的动态。
function copyArrayAndManipulate(array, fn) {
const output = [];
for (let i = 0; i < array.length; i++) {
output.push(fn(array[i]));
}
return output;
}
const result1 = copyArrayAndManipulate([1, 2],(input) => input * 5);
const result2 = copyArrayAndManipulate([1, 2],(input) => input * 3);
const result3 = copyArrayAndManipulate([1, 2],(input) => input * 4);
细心的人一定注意到了它与map函数的相似之处。
没错,它就是这么工作的。除了 map 函数之外,我们还有其他一些非常常用且广为人知的函数,例如高阶函数 (HOF)(例如filter和reduce)。
结论
高阶函数是一个简单而重要的概念,但很多人理解它有点困难。
我希望能够以更好的方式揭开这个谜团。
很快见到你!👋
鏂囩珷鏉ユ簮锛�https://dev.to/jgamaraalv/understanding-higher-order-function-1dlg