В JavaScript функции рассматриваются как объекты первого класса, что означает, что их можно присваивать переменным, передавать в качестве аргументов другим функциям и возвращать из функций. Функции высшего порядка — это функции, которые принимают другие функции в качестве аргументов или возвращают функции в качестве значений. Это мощный инструмент в JavaScript, который может помочь вам написать более лаконичный и выразительный код.

Давайте рассмотрим простой пример функции высшего порядка. Предположим, мы хотим написать функцию, которая принимает массив чисел и возвращает новый массив с удвоением каждого числа. Мы могли бы написать такую ​​функцию:

function doubleArray(arr) {
  const doubled = [];
  for (let i = 0; i < arr.length; i++) {
    doubled.push(arr[i] * 2);
  }
  return doubled;
}

Эта функция работает, но ее нельзя использовать повторно. Если бы мы хотели утроить числа в массиве, нам пришлось бы написать совершенно новую функцию. Вместо этого мы можем написать функцию более высокого порядка, которая принимает функцию в качестве аргумента и использует ее для преобразования каждого элемента в массиве. Вот как это выглядит:

function mapArray(arr, transformFunc) {
  const transformed = [];
  for (let i = 0; i < arr.length; i++) {
    transformed.push(transformFunc(arr[i]));
  }
  return transformed;
}

Функция mapArray принимает два аргумента: массив (arr) и функцию (transformFunc). Он создает новый пустой массив с именем transformed, затем перебирает каждый элемент в arr. Для каждого элемента он вызывает transformFunc с элементом в качестве аргумента и помещает результат вызова этой функции в массив transformed. Наконец, он возвращает массив transformed.

Теперь мы можем использовать mapArray, чтобы удвоить такой массив:

const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = mapArray(numbers, num => num * 2);
console.log(doubledNumbers); // [2, 4, 6, 8, 10]

Здесь мы передаем массив numbers в качестве первого аргумента функции mapArray, а функцию, удваивающую число (num => num * 2), — в качестве второго аргумента. Результатом является новый массив (doubledNumbers), в котором каждое число в numbers удваивается.

Используя функции более высокого порядка, мы можем писать более краткий и пригодный для повторного использования код, а также использовать преимущества функций как первоклассных граждан языка.