Функция высшего порядка

Оригинальное название: higher-order function

Коротко

Функция, которая принимает другую функцию как аргумент, возвращает функцию как результат или делает и то и другое.

Что такое «Функция высшего порядка»

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

Два вида

  • Принимают функцию. Классика — map, filter и reduce: перебор коллекции у них общий, а преобразование, условие отбора или способ накопления задаёт переданная функция. Её называют функцией обратного вызова, или колбэком.
  • Возвращают функцию. Это «фабрики поведения»: по параметрам собирают новую функцию с нужными настройками.

Пример: функция, которая создаёт функцию

const makeDiscount = percent => price => price * (1 - percent / 100);

const sale10 = makeDiscount(10);
const sale25 = makeDiscount(25);

sale10(2000); // 1800
sale25(2000); // 1500

Возвращённая функция «помнит» значение percent, хотя внешний вызов давно завершился. Этот механизм называется замыканием, и без него функции, возвращающие функции, были бы почти бесполезны.

Где встречается в PHP и WordPress

В PHP это array_map, array_filter, usort с пользовательским сравнением. Сортировка товаров по цене выглядит так: usort($products, fn($a, $b) => $a['price'] <=> $b['price']);. Вся система хуков WordPress построена на той же идее: add_action() и add_filter() принимают колбэк, который ядро вызовет в нужный момент. Во фронтенде — обработчики событий, setTimeout, функции debounce и throttle, которые оборачивают переданную функцию и возвращают новую с ограничением частоты вызовов.

Когда это мешает

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

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение