Когда вы выполните быстрый поиск каррирования в Google, это будут первые примеры, которые вы найдете.

Вы увидите функцию sum, складывающую два числа.

function sum(a, b) {
  return a + b; 
}

И тогда вы увидите каррированную версию, которая выглядит так.

function sum(a) {
  return function(b){
    return a + b;
  }
}

Или вы можете увидеть ту же sum каррированную функцию, написанную с помощью стрелочной функции.

const sum = a => b => a + b;

Вместо вызова функции и передачи двух аргументов sum(1,2) каррированная функция требует передачи аргументов в двух вызовах.

const sum1 = sum(1);
sum1(2); 
//3
sum(1)(2);
//3

Вы можете встретить одну и ту же sum функцию, принимающую 3 аргумента по одному.

function _sum(a, b, c) {
    return a + b + c;
}
function sum(a) {
  return function(b) {
    return function(c) {
      return a + b + c
    }
  }
}
_sum(1,2,3);
//6
sum(1)(2)(3)
//6

Другой распространенный пример, который вы увидите, - это функция multiply.

function _multiply(a, b, c) {
  return a * b * c;
}

function multiply_curried(a) {
  return function (b) {
    return function (c)  {
      return a * b * c
    }
  }
}

_multiply(1, 2, 3);
//6
multiply(1)(2)(3);
//6

На этом этапе вы, возможно, задались вопросом, кто на самом деле использует каррирование для сложения или умножения чисел?

Таким образом, подобные примеры каррирования не используются на практике.

Создание обратных вызовов

Вы будете использовать каррирование не для сложения или умножения чисел, а как решение, когда вам не хватает всех необходимых аргументов. Позже у вас будет недостающий аргумент.

Например, следующая hasId каррированная функция принимает идентификатор и возвращает новую функцию, которая принимает объект и проверяет, имеет ли он тот же идентификатор.

function hasId(id) {
  return function(obj){
    return obj.id === value;
  }
}

Теперь мы можем использовать функцию hasId curried для создания обратного вызова, необходимого для метода массива find.

hasId(2) создает функцию обратного вызова, принимающую объект.

Ниже приведен пример использования hasId для поиска определенного идентификатора в списке книг.

const books = [
  {id: 1, title: 'JavaScript'},
  {id: 2, title: 'React'}
];
const selectedBook = books.find(hasId(2));
console.log(selectedBook);
//{id: 2, title: "React"}

Мы можем пойти еще дальше и создать функцию eq, которая также принимает имя свойства.

function eq(prop) {
  return function(value){
   return function(obj){
     return obj[prop] === value;
   }
  }
}

Вы можете написать его с помощью функции стрелки, если вам так легче читать.

const eq = prop => value => obj => {
  return obj[prop] === value;
}

Теперь мы можем использовать новую eq функцию для создания предыдущей hasId функции.

const hasId = eq('id');

Мы можем использовать eq функцию, чтобы создать другую функцию hasTitle, ищущую равенство в заголовке.

const hasTitle = eq('title');

Вот как использовать новую функцию hasId для создания обратного вызова для метода массива find.

const books = [
  {id: 1, title: 'JavaScript'},
  {id: 2, title: 'React'}
];
let selectedBook = books.find(hasId(2));
console.log(selectedBook);
//{id: 2, title: "React"}

Ниже приведен пример применения функции hasTitle.

selectedBook = books.find(hasTitle('React'));
console.log(selectedBook);
//{id: 2, title: "React"}

Ключевые примечания

Каррирование - это метод преобразования функции, принимающей несколько аргументов, в последовательность функций, каждая из которых принимает один аргумент.

Например, каррирование функции f, которая принимает три аргумента f(1,2,3), создает три функции. Функция curried f вызывается следующим образом: f(1)(2)(3).

Каррирование используется для создания обратных вызовов, принимающих один аргумент.

Вы также можете проверить Что такое закрытие?.

Спасибо за прочтение.