Каррирование



Каррирование – это трансформация функций таким образом, чтобы они принимали аргументы не как f(a, b, c), а как f(a)(b)(c).

Оно не вызывает функцию. Оно просто трансформирует её.



Пример

function curry(f) {

return function(a) {

return function(b) {

return f(a, b);

};

};

}



// использование

function sum(a, b) {

return a + b;

}

let carriedSum = curry(sum);

alert( carriedSum(1)(2) ); // 3



Результат curry(func) – обёртка function(a).

Когда она вызывается как sum(1), аргумент сохраняется в лексическом окружении и возвращается новая обёртка function(b).

Далее уже эта обёртка вызывается с аргументом 2 и передаёт вызов к оригинальной функции sum.