JS Core

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

Понять, что функции в JavaScript — это значения, и научиться передавать функции как аргументы и возвращать их из других функций.

Начальный (Beginner)
Нужно знать:Перебор массивов

Кратко

Функция высшего порядка — это функция, которая принимает другую функцию как аргумент или возвращает функцию. map, filter, find — все они принимают callback-функции. Это основа functional programming в JavaScript.


Подробно

В JavaScript функции — это значения. Их можно:

  • Передавать как аргументы
  • Возвращать из других функций
  • Сохранять в переменные

Функция высшего порядка (higher-order function):

  • Принимает функцию как аргумент
  • ИЛИ возвращает функцию

Примеры встроеных higher-order functions:

  • [1,2,3].map(x => x * 2) — map принимает функцию
  • [1,2,3].filter(x => x > 1) — filter принимает функцию
  • setTimeout(() => {...}, 1000) — setTimeout принимает функцию

Создание собственной higher-order функции: function repeat(n, action) { for (let i = 0; i < n; i++) { action(i); } } repeat(3, console.log); // 0, 1, 2

Возврат функции: function multiplier(factor) { return (x) => x * factor; } const double = multiplier(2); const triple = multiplier(3); double(5); // 10 triple(5); // 15

Зачем это нужно:

  • Повторное использование логики
  • Абстракция (скрыть детали)
  • Декларативный стиль (описать ЧТО, а не КАК)

Ментальная модель

Higher-order функция — как фабрика, которая делает фабрики. Вы даёте ей «рецепт» (функцию), а она создаёт новый инструмент, который использует этот рецепт.


Примеры

**Самый простой:**

javascript
function doTwice(fn) {
  fn();
  fn();
}

doTwice(() => console.log('Привет!'));
// Привет!
// Привет!

doTwice — higher-order функция. Она принимает функцию и вызывает её дважды.

**Простой:**

javascript
function createGreeter(greeting) {
  return (name) => `${greeting}, ${name}!`;
}

const greetHello = createGreeter('Привет');
const greetBye = createGreeter('Пока');

console.log(greetHello('Анна')); // Привет, Анна!
console.log(greetBye('Пётр'));   // Пока, Пётр!

createGreeter возвращает новую функцию. Каждая «кастомная» функция использует свой greeting.

**Реальный пример:**

javascript
function createValidator(validateFn) {
  return (value) => {
    const isValid = validateFn(value);
    return { value, isValid, errors: isValid ? [] : ['Invalid'] };
  };
}

const isEmail = createValidator(v => v.includes('@'));
const isPositive = createValidator(v => v > 0);

console.log(isEmail('test@test.com')); // { isValid: true, ... }
console.log(isPositive(-5));           // { isValid: false, ... }

Higher-order функции позволяют создавать reusable валидаторы, логгеры, обработчики —anything.


Частые ошибки

**Неправильно:** Думать, что callback — это особый тип

**Почему:** Callback — это просто функция, переданная как аргумент. Ничего особенного.

**Правильно:** Callback — это любая функция, переданная другой функции.

**Неправильно:** Не понимать, зачем возвращать функцию

**Почему:** Возврат функции позволяет создавать «кастомные» функции с предустановленными настройками.

**Правильно:** Возврат функции — это factory pattern: создаёте функцию с предустановленным поведением.

**Неправильно:** Путать map с forEach

**Почему:** map возвращает новый массив, forEach — undefined.

**Правильно:** map → новый массив. forEach → undefined (просто побочный эффект).


Важно запомнить

  • Функции — это значения, их можно передавать и возвращать
  • Higher-order: принимает функцию ИЛИ возвращает функцию
  • map, filter, find — примеры higher-order functions
  • Callback — просто функция как аргумент
  • Возврат функции позволяет создавать «кастомные» инструменты

Связь

Назад: Вы знаете методы массивов (J14, J15) — теперь вы понимаете, почему они работают именно так.

Вперёд: Следующий урок (J17) — Object.keys/values/entries: как перебирать свойства объекта.

Материалы курса JS Core — PROlab Academy.