Кратко
Функция высшего порядка — это функция, которая принимает другую функцию как аргумент или возвращает функцию. 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 функция — как фабрика, которая делает фабрики. Вы даёте ей «рецепт» (функцию), а она создаёт новый инструмент, который использует этот рецепт.
Примеры
**Самый простой:**
function doTwice(fn) {
fn();
fn();
}
doTwice(() => console.log('Привет!'));
// Привет!
// Привет!doTwice — higher-order функция. Она принимает функцию и вызывает её дважды.
**Простой:**
function createGreeter(greeting) {
return (name) => `${greeting}, ${name}!`;
}
const greetHello = createGreeter('Привет');
const greetBye = createGreeter('Пока');
console.log(greetHello('Анна')); // Привет, Анна!
console.log(greetBye('Пётр')); // Пока, Пётр!createGreeter возвращает новую функцию. Каждая «кастомная» функция использует свой greeting.
**Реальный пример:**
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: как перебирать свойства объекта.