---
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)**