Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавляет ответ на вопрос: 'Что такое функции высшего порядка ?' #5263

Merged
merged 19 commits into from
Apr 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
22e1285
Добавляет ответ на вопрос про HOF
vitya-ne Apr 6, 2024
fa8e095
Немного расширяет формулировку
vitya-ne Apr 6, 2024
aad1011
Корректирует фомулировки
vitya-ne Apr 7, 2024
2fab7a0
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
fd63a76
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
7053e36
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
10eff2b
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
ddf163a
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
1b908b2
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
06d299e
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
701b981
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
d4a398a
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
89d0685
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
99736db
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
5a18092
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
50eeedd
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
a318eba
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 8, 2024
3da21b1
Изменяет формулировку
vitya-ne Apr 9, 2024
db8dee9
Update interviews/higher-order-functions/answers/vitya-ne/index.md
vitya-ne Apr 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions interviews/higher-order-functions/answers/vitya-ne/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
Функция высшего порядка (Higher Order Function) — это функция, которая принимает в качестве аргумента другие функции и/или возвращает в результате своей работы функцию.

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

Рассмотрим несколько примеров.

`setTimeout()` — глобальная функция высшего порядка, так как принимает в качестве аргумента функцию, которая выполняется с указанной задержкой:

```js
setTimeout(
() => {console.log('А вот и я!')},
5000
)
```

Многие методы массива являются функциями высшего порядка, так как принимают в качестве аргумента колбэк-функции, которые перебирают элементы массива. Например, метод [`.map()`](/js/array-map/) принимает в качестве аргумента функцию, которая преобразовывает каждый элемент в массиве:

```js
const years = [1970, 1990, 1995]

const objects = years.map(item => {
return {
year: item
}
})

console.log(objects)
// [ { year: 1970 }, { year: 1990 }, { year: 1995 } ]
```

Функции высшего порядка используют для реализации подхода «частичное применение функции». В нём функция при первом вызове принимает только часть нужных аргументов и возвращает новую функцию, пока ждёт остальные аргументы. Такой подход строится на механизме замыкания.
vitya-ne marked this conversation as resolved.
Show resolved Hide resolved

Рассмотрим как работает реализация подхода на примере. Создадим простую функцию логирования. Она принимает имя источника сообщения и текст сообщения в качестве аргументов:

```js
const log = (sourceName, message) => {
console.log(sourceName,':', message)
}
```

Такую функцию не удобно многократно использовать для одного и того же источника сообщений, так как придётся повторно указывать первый аргумент:

```js
log('Модуль A', 'Запуск')
// Модуль A: Запуск

log('Модуль A', 'Проведено тестирование грунта')
// Модуль A: Проведено тестирование грунта
```

Изменим функцию так, чтобы она умела «запоминать» первый аргумент `sourceName`:

```js
// HOF-функция логирования
const log = sourceName => message => {
console.log(sourceName,':', message)
}
```

Теперь `log()` — это функция высшего порядка, так как она возвращает другую функцию.
Полученная в результате вызова `log()` функция хранит источник сообщений и готова для вызова только с аргументом `message`:

```js
const logAppolo = log('Appolo 13')

logAppolo('Хьюстон…')
// Appolo 13: Хьюстон…

logAppolo('Хьюстон, у нас проблема')
// Appolo 13: Хьюстон, у нас проблема
```
1 change: 1 addition & 0 deletions interviews/higher-order-functions/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
related:
- js/function
- tools/fp
author: vitya-ne
---

Что такое функции высшего порядка (Higher Order Functions)?
Loading