#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));
Комментариев нет:
Отправить комментарий