Замыкание. Умножение сохраненного параметра на переданный
Суть задачи в следующем:
Нужно написать функцию, которая принимает 1 параметр. При первом вызове, этот параметр запомнится , а при втором - умножает переданный параметр с тем, что передали первый раз и так можно делать до бесконечности. const number5 = number(5); const number10 = number5(2); const number30 = number10(3); number30(2) // 60 .... и так можно сколько угодно раз Вот моя функция с замыканием, вполне себе просто, а главное хорошо работает, доп проверки мне ни к чему - этого нет в условии: function math(value){ let counter=1; return function(number){ return counter *= number; } } Вот как она работает: math(5) // 5 math(2) // 10 math(3) // 30 Но все таки мне нужно, что бы она работала по другому : const number5 = math(5); const number10 = number5(2); // и уже тут мне пишет, что number5 не функция .... и это логично, ведь мы ей присвоили значение от вызова math(5) const number30 = number10(3); number30(2) // 60 .... и так можно сколько угодно раз Так вот как всё же сделать, что бы это работало так как мне надо, спасибо! Подскажите, как это можно реализовать... спасибо |
worldsering, напиши функцию, которая возвращает функцию. Посмотри на результат, и задавай вопросы если проблема ещё остаётся.
|
Функции, возвращающие функции, которые возвращают функции...
А результат умножения как получить? |
function math(value) { if (this.store === undefined) { this.store = value } else { this.store *= value } return this.store } console.log(math(5)) // 5 console.log(math(2)) // 10 console.log(math(3)) // 30 функция это объект внутри объекта можно хранить значения |
worldsering,
class Counter { constructor(initialValue = 1) { this.value = initialValue; } multiply(value) { return this.value *= value; } } var counter = ( counter => counter.multiply.bind(counter) )(new Counter(1)); console.log([ counter(5) === 5, counter(2) === 10, counter(3) === 30, counter(2) === 60, ]); |
Цитата:
это старая избитая задача, где вся хитрость состоит в использовании valueOf для получения результата. Ну и есть ещё одна тонкость - каждый вызов должен возвращать новую функцию, чтобы было иммутабельно, для переиспользования промежуточных результатов. |
Спасибо, но это не работает так, как мне нужно ...
const number5 = math(5); const number10 = number5(2); // и уже тут мне пишет, что number5 не функция const number30 = number10(3); number30(2) \\ уже естественно ничего не выдаст |
Цитата:
Цитата:
Спасибо, но это не работает так, как мне нужно ... const number5 = math(5); const number10 = number5(2); // и уже тут мне пишет, что number5 не функция const number30 = number10(3); number30(2) \\ уже естественно ничего не выдаст |
Цитата:
Не могу понять, для чего мне использовать valueOf ........ Можете подсказать как это применить на моём примере, только прежде, посмотрите пожалуйста сообщения выше, что бы вы точно поняли, что именно мне нужно ... Спасибо |
worldsering,
function number(num) { const inner = function(n) { const numberN = function(n1) { return inner(n * n1); } numberN.valueOf = function() { return n; }; numberN.toString = function() { return String(n); }; return numberN; } return inner(num); } const number5 = number(5); const number10 = number5(2); const number30 = number10(3); const number15 = number5(3); // другая ветка умножения alert([number5, number10, number30, number15, number10 + number15].join('\n')); |
Часовой пояс GMT +3, время: 23:25. |