Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Функция сложения чисел через замыкание [дубликат]

#javascript


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            разделить один аргумент ф-ци на два
                                
                                    (2 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Доброго времени суток. Очень интересует такой вопрос: как через замыкание создать
функцию которая, например, складывает числа таким образом:

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

console.log(sum(5)(6)); //11


только чтоб можно было складывать больше 2х скобок, например, sum(2)(3)(4)(5)...N
    


Ответы

Ответ 1



Чем-то напоминает кату из CodeWars, но попроще. function sum(n){ sum.result += n; return sum; } sum.result = 0; sum.valueOf = sum.toString = _ => sum.result; console.info(sum(1)(2)(3));

Ответ 2



Подход при создании функций, которые можно вызывать подряд неизвестное заранее число раз довольно стандартен: Чтобы результат можно было вызвать как функцию, нужно вернуть функцию Чтобы все-таки была возможность получить результат, нужно переопределить у возвращаемой функции методы valueOf, toString, какой-нибудь один, либо все сразу. И самое главное - нужно хранить где-то результат, который можно вернуть переопределенными функциями. Из соседнего ответа видно, что возвращать можно исходную функцию, у которой переопределены соответствующие методы. И результат хранится в поле самой функции. Недостаток такого подхода в том, что состояние - глобально, и изменив вручную поле result, можно сломать последующие цепочки. Так же, можно сразу использовать внутреннюю функцию, и хранить результат, не в ее поле, а в замкнутой переменной, например так: function sum(a) { var s = a; function innerSum(b) { return sum(a + b); }; innerSum.toString = innerSum.valueOf = function() { return s; } return innerSum; } console.info(sum(1)(2)(3)); В этом случае идет предположение, что функции принимают только один аргумент. Если нужно расширить решение, чтобы любая функция могла принимать несколько аргументов, нужно внутри применить к ним функцию reduce, для применения конкретной функции ко всем переданным параметрам, например так: function sum(...params) { var s = params.reduce((a, b) => a + b); function innerSum(...innerParams) { return sum(...innerParams.concat(s)); }; innerSum.toString = innerSum.valueOf = function() { return s; } return innerSum; } console.info(sum(1, 2)(3, 4)(5, 6)); console.info(sum(1)(2)(3)(4)(5)(6)); // все еще работает console.info(sum(1)(2, 3)(4, 5, 6));

Комментариев нет:

Отправить комментарий