Функции высшего порядка в JavaScript являются неотъемлемой частью кода любого разработчика. Но что это такое и как они работают? Начнем с их определения.

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

Что все это значит? Чтобы получить лучшее представление, давайте взглянем на пару общих функций высшего порядка, .map и .filter. Обе эти функции могут принимать функцию в качестве аргумента. Мы увидим, как эта функция обратного вызова применяется к массиву, для которого вызывается наша исходная функция. Мы можем начать с рассмотрения функции .map.

Функция .map может быть вызвана для массива и будет перебирать его. Он будет вызывать функцию обратного вызова для каждого элемента массива. Новый массив будет возвращен без изменения исходного массива. Для этого примера мы возьмем исходный массив чисел и удвоим каждое из них. Сначала давайте посмотрим, как это будет работать без использования функции .map.

Давайте немного разберем это. Сначала мы определяем наш начальный массив для переменной originalArr. Далее мы определяем нашу двойную функцию. Внутри мы объявляем новый пустой массив newArr. Затем у нас есть цикл for, который использует позицию индекса каждого элемента в массиве для его вызова, а затем умножает его на 2 и устанавливает его в переменную num. Затем Num помещается в наш новый массив, и после завершения цикла for функция возвращает новый массив, newArr. Когда функция double вызывается с переданным в качестве аргумента originalArr, она возвращает новый массив, содержащий удвоенные значения. Исходный Arr не изменяется. Но это какой-то уродливый код! Давайте проведем рефакторинг с помощью функции .map.

На этот раз мы определяем переменную double и назначаем ей анонимную функцию. Затем, когда мы вызываем .map для исходного массива, мы можем передать его. Он служит функцией обратного вызова, поскольку он будет вызываться для каждого переданного ему элемента. При записи в одну строку .map использует неявный возврат и всегда будет возвращать новый массив. Теперь мы могли бы сделать еще один шаг вперед и сократить это до одной строки, написав функцию следующим образом:

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

Некрасиво, но мы можем сломать это. Внутри функции filterArr переменная newArr присваивается пустому массиву. Затем цикл for используется для перебора переданного массива. Внутри блока цикла for вызывается оператор if. Если число в индексированной позиции массива делится на 2 без остатка, оно оценивается как истинное, и это число помещается в newArr. Наконец, этот новый массив возвращается. Было ли это так же весело читать, как и печатать? Бла-бла, давайте почистим это.

Функция .filter будет перебирать массив и возвращать новый массив, заполненный всеми элементами, которые разрешаются в функции обратного вызова в значение true. Это означает, что мы будем использовать функцию обратного вызова для определения равенства. В этом примере функция isEven определяется отдельно и передается в функцию .filter. Гораздо чище более простой код. Может ли он стать чище? Вы держите пари.

Эта функция высшего порядка позволяет нам реорганизовать это до одной строки! Как это чисто!

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