JavaRush /Курсы /Модуль 1: Web Core /Функции высшего порядка

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

Модуль 1: Web Core
19 уровень , 4 лекция
Открыта

5.1 Основные концепции

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

Что такое функции высшего порядка?

Функции высшего порядка (higher-order functions) — это функции, которые принимают в качестве аргументов другие функции или возвращают функции в качестве результата. Они позволяют использовать функции как объекты первого класса, что дает возможность создавать более абстрактные и модульные программы.

Примеры функций высшего порядка

  1. Передача функций как аргументов.
  2. Возврат функций из других функций.

5.2 Передача функций как аргументов

Использование встроенных методов массивов

JavaScript предоставляет множество встроенных методов для работы с массивами, которые являются функциями высшего порядка, такими как forEach(), map(), filter(), reduce() и другие.

1. Метод forEach()

Метод forEach() выполняет указанную функцию один раз для каждого элемента массива.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];

      numbers.forEach(function(number) {
        console.log(number);
      });
      // Выведет: 1 2 3 4 5
    
  

2. Метод map()

Метод map() создает новый массив с результатами вызова указанной функции для каждого элемента массива.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const squaredNumbers = numbers.map(function(number) {
        return number * number;
      });

      console.log(squaredNumbers);
      // Выведет: [1, 4, 9, 16, 25]
    
  

3. Метод filter()

Метод filter() создает новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const evenNumbers = numbers.filter(function(number) {
        return number % 2 === 0;
      });

      console.log(evenNumbers);
      // Выведет: [2, 4]
    
  

4. Метод reduce()

Метод reduce() применяет функцию к аккумулятору и каждому элементу массива (слева направо), сводя его к единому значению.

JavaScript
    
      const numbers = [1, 2, 3, 4, 5];
      const sum = numbers.reduce(function(total, number) {
        return total + number;
      }, 0);

      console.log(sum);
      // Выведет: 15
    
  

5.3 Возврат функций из других функций

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

1. Каррирование (Currying)

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

Пример каррирования:

JavaScript
    
      function multiply(a) {
        return function(b) {
          return a * b;
        };
      }

      const multiplyByTwo = multiply(2);
      console.log(multiplyByTwo(5)); // Выведет: 10

      const multiplyByThree = multiply(3);
      console.log(multiplyByThree(5)); // Выведет: 15
    
  

2. Создание настраиваемых функций

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

Пример:

JavaScript
    
      function createGreeting(greeting) {
        return function(name) {
          console.log(`${greeting}, ${name}!`);
        };
      }

      const sayHello = createGreeting('Hello');
      sayHello('Alice'); // Выведет: Hello, Alice!

      const sayHi = createGreeting('Hi');
      sayHi('Bob'); // Выведет: Hi, Bob!
    
  

5.4 Практическое применение

Рассмотрим практическое применение функций высшего порядка.

Функция compose()

Функция compose() позволяет объединять несколько функций в одну, которая применяет их по цепочке:

JavaScript
    
      function compose(...functions) {
        return function(initialValue) {
          return functions.reduceRight((value, func) => func(value), initialValue);
        };
      }

      const addOne = x => x + 1;
      const double = x => x * 2;
      const addOneAndDouble = compose(double, addOne);
      console.log(addOneAndDouble(5)); // Выведет: 12 (сначала добавляет 1 к 5, затем удваивает результат)
    
  

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

Асинхронные функции высшего порядка позволяют работать с асинхронными операциями, такими как запросы к API или работа с таймерами:

JavaScript
    
      function fetchData(callback) {
        setTimeout(() => {
          callback('Data received');
        }, 1000);
      }

      function processData(data) {
        console.log(data);
      }

      fetchData(processData);
      // Выведет: Data received (через 1 секунду)
    
  
1
Задача
Модуль 1: Web Core, 19 уровень, 4 лекция
Недоступна
Каррирование умножения
Каррирование умножения
1
Задача
Модуль 1: Web Core, 19 уровень, 4 лекция
Недоступна
Функция приветствия
Функция приветствия
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ахмад Уровень 35
18 октября 2025
Запись каррирования через обычные функции слишком громоздкая — с помощью стрелочных функций каррирование можно упростить:

const multiply = a => b => a * b;
console.log(multiply(3)(4));
Анастасия Уровень 34
18 августа 2025
Опять грешите.... Вот и так пример сложный, а вы туда ещё и функцию запихнули, которая не описана как работает (я про reduceRight). Молодцы... Вы бы хоть вначале писали изучите самостоятельно такое-то такое-то, чтобы в ступор не вводить всех =( Последний пример вообще не понятный Почему такое обращение?

fetchData(processData);
Почему мы к fetchData обращаемся как к функции(со скобочками), а к processData как к переменной(без скобочек, хотя мы не приравнивали функцию к переменной).... Что за data в параметрах функции processData.... Пока больше вопросов, чем ответов, как будто статьи отдельные в интернете читаешь, а не декции проходишь, к сожалению =(
Анастасия Уровень 34
18 августа 2025
Кажется разобралась, но это не отменяет того, что вы колбеки не объясняли, но при этом применяете его постоянно в сложных примерах
Ilona Уровень 23
15 апреля 2025

Асинхронные функции высшего порядка
Асинхронные функции высшего порядка позволяют работать с асинхронными операциями, такими как запросы к API или работа с таймерами:
Вы бы для начала обьяснили, что такое асинхронные функции. Читаю по вашему учебнику и ничего не понятно. Приходится спрашивать у Гугла или АI. А потом самое интересное: идешь в описание программы и только в 22 уровне тема Асинхронность. Промисы и Бэкэнд И здесь у меня резонный вопрос: кто составлял эту программу и почему все так не последовательно?
Виктор Рябов Уровень 21
5 марта 2025
не совсем понятно зачем это. много пишут про то, что нужно упрощать функции, что бы она делала одну задачу и т.д. и т.п. а тут получается мы намеренно усложняем. чем к примеру хуже или менее удобный подход, когда мы результат одной функции используем в другой но написаны они отдельно? кто подскажет, зачем это? я про Возврат функций из других функций если что))
Vadim Makarenko Уровень 42
28 июля 2025
Я понимаю это так. Если не критично время, затрачиваемое на вызов бог знает где расположенной функции, передача ей аргументов и получение результата (а ведь вызов может быть в цикле), то можно удовлетвориться возвращением результата. Но если время критично, то приходится использовать что-то типа стрелочной функции в параметрах или ссылки на функцию. Как я понимаю, при компиляции код одной функции встроится в другую, что сократит время выполнения и отпадёт надобность в переписывании.