JavaScript 中的高阶函数

简介: JavaScript 中的高阶函数

程序员的面试题库 web前端面试题库 VS java后端面试题库大全

在 JavaScript 中,函数被视为一等公民。我们可以将函数视为值并将它们分配给另一个变量,将它们作为参数传递给另一个函数,甚至从另一个函数返回它们。

函数作为一等函数的这种能力是 JavaScript 中高阶函数的动力。

基本上,将另一个函数作为参数或返回函数的函数称为高阶函数。

让我们深入了解一下这两种类型的实现,即:

  • 将函数作为参数传递给另一个函数
  • 从另一个函数返回一个函数


如何将函数作为参数传递给另一个函数

在本节中,我们将了解如何将函数作为参数发送,以及它最终如何帮助我们编写更简洁的代码。

考虑下面的代码,我们要在其中创建一个接受数组作为参数的函数。它从中过滤掉所有奇数并返回所有过滤后的数字。

该函数将如下所示:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
function filterOdd(arr) {
  const filteredArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % 2 !== 0) {
      filteredArr.push(arr[i]);
    }
  }
  return filteredArr;
}
console.log(filterOdd(arr));
// Output:
// [ 1, 3, 5, 7, 9, 11 ]

上面的函数返回过滤后的数组[ 1, 3, 5, 7, 9, 11 ],其中我们有所有奇数,正如预期的那样。

现在假设我们还想创建一个函数来过滤并返回所有偶数。我们可以很好地继续创建以下函数来实现这一点:

function filterEven(arr) {
  const filteredArr = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % 2 == 0) {
      filteredArr.push(arr[i]);
    }
  }
  return filteredArr;
}
console.log(filterEven(arr));
// Output:
// [ 2, 4, 6, 8, 10 ]

同样,正如预期的那样,我们将得到一个包含所有偶数的数组的所需输出 - [ 2, 4, 6, 8, 10 ]

但是请注意,我们在这种方法中编写了很多重复的代码。以上两个函数都做了很多共同的事情,比如接受原始数组,创建一个新数组来存储过滤后的数组,循环整个主数组,最后返回过滤后的数组。

这两个函数之间的唯一区别是它们用于过滤掉原始数组的逻辑。

对于函数filterOdd,我们使用逻辑,arr[i] % 2 !== 0而在filterEven函数中,我们使用逻辑arr[i] % 2 == 0过滤掉原始数组。

这是我们可以从使用高阶函数中受益的地方。主要目的是创建一个函数来完成我们在上述两个函数中所做的所有常见事情,并将逻辑部分作为参数单独传递给该函数。让我们看看如何实现这一点。

让我们创建一个函数来完成我们在filterOddandfilterEven函数中执行的所有常见操作。这将是这样的:

function filterFunction(arr, callback) {
  const filteredArr = [];
  for (let i = 0; i < arr.length; i++) {
    callback(arr[i]) ? filteredArr.push(arr[i]) : null;
  }
  return filteredArr;
}

暂时忽略这个callback参数。请注意,在 new 中filterFuntion我们如何保留所有常见步骤,即接受原始数组,创建一个新数组来存储过滤后的数组,循环整个主数组,最后返回我们在filterOddandfilterEven函数中执行的过滤后的数组.

现在callback参数基本上接受了逻辑,它只不过是另一个包含过滤逻辑的函数。为了分别过滤奇数和偶数,下面是我们需要编写的逻辑函数:

// Function containing logic for filtering out odd numbers
function isOdd(x) {
  return x % 2 != 0;
}
// Function containing logic for filtering out even numbers
function isEven(x) {
  return x % 2 === 0;
}

而已!我们现在只需要将主数组以及逻辑函数传递给我们filterFunction,如下所示:

// For filtering out odd numbers
filterFunction(arr, isOdd)
// Output of console.log(filterFunction(arr, isOdd)):
// [ 1, 3, 5, 7, 9, 11 ]
// For filtering out even numbers
filterFunction(arr, isEven)
// Output of console.log(filterFunction(arr, isEven)):
// [ 2, 4, 6, 8, 10 ]

通过这种方式,我们将逻辑函数(如isOddisEven作为参数)传递给另一个函数filterFunction。 我们基本上是从 main 函数中抽象出主要的过滤逻辑。我们现在可以根据需要传递任何其他过滤逻辑,filterFunction而无需更改它。

例如,如果我们想过滤掉一个大于 5 的数字,那么我们只需要编写如下过滤逻辑:

function isGreaterThanFive(x) {
  return x > 5;
}

并将其作为参数传递给filterFunction

filterFunction(arr, isGreaterThanFive)
// Output of console.log(filterFunction(arr, isGreaterThanFive)):
// [ 6, 7, 8, 9, 10, 11 ]

我们还可以将逻辑函数作为箭头函数传递并得到相同的结果——也就是说,(x) => x > 5)代替传递isGreaterThanFive将给我们相同的结果。

filterFunction(arr, (x) => x > 5)
// Output of console.log(filterFunction(arr, (x) => x > 5)):
// [ 6, 7, 8, 9, 10, 11 ]

程序员的面试题库 web前端面试题库 VS java后端面试题库大全

相关文章
|
前端开发 JavaScript
前端基础 - JavaScript高级应用(高阶函数)
前端基础 - JavaScript高级应用(高阶函数)
138 0
|
存储 JavaScript 前端开发
js数组高阶函数——includes()方法
js数组高阶函数——includes()方法
1152 0
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
463 0
|
JavaScript 前端开发 测试技术
JavaScript进阶-高阶函数与柯里化
【6月更文挑战第18天】在JavaScript中,高阶函数和柯里化是函数式编程的核心。高阶函数接收或返回函数,常用于数组操作和事件处理。柯里化将多参数函数转化为单参数的逐次求值过程,用于参数预绑定和函数组合。两者能简化逻辑、提高复用性,但也需注意易错点,如混淆参数、过度柯里化,应适度使用并配合测试保证正确性。通过实践和使用工具,如lodash的`_.curry`,能更好地利用这些技术。
157 5
|
JavaScript 前端开发 测试技术
JavaScript中的函数式编程:纯函数与高阶函数的概念解析
【4月更文挑战第22天】了解JavaScript中的函数式编程,关键在于纯函数和高阶函数。纯函数有确定输出和无副作用,利于预测、测试和维护。例如,`add(a, b)`函数即为纯函数。高阶函数接受或返回函数,用于抽象、复用和组合,如`map`、`filter`。函数式编程能提升代码可读性、可维护性和测试性,帮助构建高效应用。
|
前端开发 JavaScript 容器
早期 JavaScript 中的高阶函数与模块化实现
早期 JavaScript 中的高阶函数与模块化实现
108 0
|
JavaScript 前端开发
JavaScript中高阶函数与闭包的实际应用
【4月更文挑战第22天】JavaScript中的高阶函数和闭包是强大的工具,常用于抽象、复用和构建组合逻辑。高阶函数如回调、数组方法和函数组合能提高代码灵活性。闭包则用于封装私有变量、创建函数工厂和在异步编程中保留上下文。两者结合使用,如`createAccumulator`函数,能创建更灵活的代码结构。
|
JavaScript 安全 前端开发
高阶函数(js的问题)
高阶函数(js的问题)
115 0
|
JavaScript 前端开发 数据格式
vue写法——使用js高阶函数实现多条件搜索功能
vue写法——使用js高阶函数实现多条件搜索功能
374 0
vue写法——使用js高阶函数实现多条件搜索功能

热门文章

最新文章