78 lines
2.7 KiB
Markdown
78 lines
2.7 KiB
Markdown
---
|
||
sidebar_position: 12
|
||
---
|
||
|
||
# Каррирование (currying)
|
||
|
||
**Каррирование (currying)** в JavaScript — это процесс преобразования функции с несколькими аргументами в последовательность функций, каждая из которых принимает только один аргумент.
|
||
|
||
Каррирование – это трансформация функций таким образом, чтобы они принимали аргументы не как `f(a, b, c)`, а как `f(a)(b)(c)`.\
|
||
Каррирование не вызывает функцию. Оно просто трансформирует её.\
|
||
Делает код более декларативным и удобным для переиспользования.
|
||
|
||
## Основная идея:
|
||
|
||
Вместо:
|
||
```js
|
||
function sum(a, b, c) {
|
||
return a + b + c;
|
||
}
|
||
sum(1, 2, 3); // 6
|
||
```
|
||
После каррирования:
|
||
```js
|
||
function curriedSum(a) {
|
||
return function(b) {
|
||
return function(c) {
|
||
return a + b + c;
|
||
};
|
||
};
|
||
}
|
||
curriedSum(1)(2)(3); // 6
|
||
```
|
||
|
||
## Зачем нужно каррирование?
|
||
|
||
1. **Частичное применение** — можно фиксировать часть аргументов и получать новую функцию:
|
||
```js
|
||
const addTwo = curriedSum(1)(2);
|
||
addTwo(3); // 6
|
||
addTwo(5); // 8
|
||
```
|
||
2. **Удобство композиции функций** — каррированные функции легче комбинировать.
|
||
3. **Чистые функции** — каррирование часто используется в функциональном программировании.
|
||
|
||
## Автоматическое каррирование (с помощью утилит):
|
||
|
||
Можно написать вспомогательную функцию:
|
||
|
||
```js
|
||
function curry(fn) {
|
||
return function curried(...args) {
|
||
if (args.length >= fn.length) {
|
||
return fn.apply(this, args);
|
||
} else {
|
||
return function(...args2) {
|
||
return curried.apply(this, args.concat(args2));
|
||
};
|
||
}
|
||
};
|
||
}
|
||
|
||
const curriedSum = curry(sum);
|
||
curriedSum(1)(2)(3); // 6
|
||
curriedSum(1, 2)(3); // 6
|
||
```
|
||
|
||
🔹 Пример из реального мира (React + Redux):
|
||
```js
|
||
const connect = (mapStateToProps) => (mapDispatchToProps) => (Component) => {
|
||
// логика подключения компонента
|
||
console.log();
|
||
});
|
||
// Использование:
|
||
connect(mapState)(mapDispatch)(MyComponent);
|
||
```
|
||
|
||
🚀 **_Источник: DeepSeek_** \
|
||
🚀 **Источник: [https://learn.javascript.ru/currying-partials](https://learn.javascript.ru/currying-partials)** |