Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.04.2021, 23:25
Интересующийся
Отправить личное сообщение для worldsering Посмотреть профиль Найти все сообщения от worldsering
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2021, 01:04
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

worldsering, напиши функцию, которая возвращает функцию. Посмотри на результат, и задавай вопросы если проблема ещё остаётся.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2021, 08:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Функции, возвращающие функции, которые возвращают функции...
А результат умножения как получить?
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2021, 12:45
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 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

функция это объект
внутри объекта можно хранить значения
Ответить с цитированием
  #5 (permalink)  
Старый 02.04.2021, 13:03
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 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,
]);
Ответить с цитированием
  #6 (permalink)  
Старый 02.04.2021, 13:11
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от voraa
А результат умножения как получить?
через valueOf

это старая избитая задача, где вся хитрость состоит в использовании valueOf для получения результата.

Ну и есть ещё одна тонкость - каждый вызов должен возвращать новую функцию, чтобы было иммутабельно, для переиспользования промежуточных результатов.
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2021, 13:33
Интересующийся
Отправить личное сообщение для worldsering Посмотреть профиль Найти все сообщения от worldsering
 
Регистрация: 01.04.2021
Сообщений: 11

Спасибо, но это не работает так, как мне нужно ...
const number5 = math(5);
const number10 = number5(2); // и уже тут мне пишет, что number5 не функция
const number30 = number10(3);
number30(2) \\ уже естественно ничего не выдаст
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2021, 13:35
Интересующийся
Отправить личное сообщение для worldsering Посмотреть профиль Найти все сообщения от worldsering
 
Регистрация: 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) \\ уже естественно ничего не выдаст
Ответить с цитированием
  #9 (permalink)  
Старый 02.04.2021, 13:40
Интересующийся
Отправить личное сообщение для worldsering Посмотреть профиль Найти все сообщения от worldsering
 
Регистрация: 01.04.2021
Сообщений: 11

Сообщение от Alexandroppolus Посмотреть сообщение
через valueOf

это старая избитая задача, где вся хитрость состоит в использовании valueOf для получения результата.

Ну и есть ещё одна тонкость - каждый вызов должен возвращать новую функцию, чтобы было иммутабельно, для переиспользования промежуточных результатов.
__________________________________________________ _____
Не могу понять, для чего мне использовать valueOf ........
Можете подсказать как это применить на моём примере, только прежде, посмотрите пожалуйста сообщения выше, что бы вы точно поняли, что именно мне нужно ...
Спасибо
Ответить с цитированием
  #10 (permalink)  
Старый 02.04.2021, 14:10
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 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'));
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск