01.04.2021, 23:25
|
Интересующийся
|
|
Регистрация: 01.04.2021
Сообщений: 11
|
|
Замыкание. Умножение сохраненного параметра на переданный
Суть задачи в следующем:
Нужно написать функцию, которая принимает 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, 02.04.2021 в 13:43.
|
|
02.04.2021, 01:04
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
worldsering, напиши функцию, которая возвращает функцию. Посмотри на результат, и задавай вопросы если проблема ещё остаётся.
__________________
29375, 35
|
|
02.04.2021, 08:44
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Функции, возвращающие функции, которые возвращают функции...
А результат умножения как получить?
|
|
02.04.2021, 12:45
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
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
функция это объект
внутри объекта можно хранить значения
|
|
02.04.2021, 13:03
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
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,
]);
|
|
02.04.2021, 13:11
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от voraa
|
А результат умножения как получить?
|
через valueOf
это старая избитая задача, где вся хитрость состоит в использовании valueOf для получения результата.
Ну и есть ещё одна тонкость - каждый вызов должен возвращать новую функцию, чтобы было иммутабельно, для переиспользования промежуточных результатов.
|
|
02.04.2021, 13:33
|
Интересующийся
|
|
Регистрация: 01.04.2021
Сообщений: 11
|
|
Спасибо, но это не работает так, как мне нужно ...
const number5 = math(5);
const number10 = number5(2); // и уже тут мне пишет, что number5 не функция
const number30 = number10(3);
number30(2) \\ уже естественно ничего не выдаст
|
|
02.04.2021, 13:35
|
Интересующийся
|
|
Регистрация: 01.04.2021
Сообщений: 11
|
|
Сообщение от Nexus
|
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,
]);
|
Сообщение от Vlasenko Fedor
|
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
функция это объект
внутри объекта можно хранить значения
|
____________________________________________
Спасибо, но это не работает так, как мне нужно ...
const number5 = math(5);
const number10 = number5(2); // и уже тут мне пишет, что number5 не функция
const number30 = number10(3);
number30(2) \\ уже естественно ничего не выдаст
|
|
02.04.2021, 13:40
|
Интересующийся
|
|
Регистрация: 01.04.2021
Сообщений: 11
|
|
Сообщение от Alexandroppolus
|
через valueOf
это старая избитая задача, где вся хитрость состоит в использовании valueOf для получения результата.
Ну и есть ещё одна тонкость - каждый вызов должен возвращать новую функцию, чтобы было иммутабельно, для переиспользования промежуточных результатов.
|
__________________________________________________ _____
Не могу понять, для чего мне использовать valueOf ........
Можете подсказать как это применить на моём примере, только прежде, посмотрите пожалуйста сообщения выше, что бы вы точно поняли, что именно мне нужно ...
Спасибо
|
|
02.04.2021, 14:10
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
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'));
|
|
|
|