Сохранение состояния в функции Карри


Есть ли способ сохранить какое-то внутреннее состояние при написании функции Карри?

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

То есть добавить прогрессивно(3)(4)(5) = 1*3 + 2*4 + 3*5 = 26.

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

1 2

1 ответ:

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

function addProgressively(x) {
    var factor = 1,
        sum = factor * x;

    function f(y) {
        factor++;
        sum += factor * y;
        return f;
    }; 
    f.toString = function () { return sum; };
    return f;
}

console.log(addProgressively(3)(4)(5));