В 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
удваивается.
Используя функции более высокого порядка, мы можем писать более краткий и пригодный для повторного использования код, а также использовать преимущества функций как первоклассных граждан языка.