Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкание. Умножение сохраненного параметра на переданный (https://javascript.ru/forum/misc/82211-zamykanie-umnozhenie-sokhranennogo-parametra-na-peredannyjj.html)

worldsering 02.04.2021 14:32

Цитата:

Сообщение от Alexandroppolus (Сообщение 535145)
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'));

__________________________________________________ ______
Спасибо но в итоге,
const number5 = number(5);
const number10 = number5(2);
console.log(number10(3)) // Выведет функцию, а не 30
console.log(number10(3).valueOf()) // Выведет 30

Можно ли как то это сделать без дополнительного метода valueOf.

Alexandroppolus 02.04.2021 14:39

Цитата:

Сообщение от worldsering
console.log(number10(3)) // Выведет функцию, а не 30

тут уж ничего сделать не получится.
если у тебя функция, то чем её не обвешивай, а всё равно она останется функцией, а не числом.
и console.log напишет о ней всю правду.

вероятно, эту проблему можно решить через Proxy, пока точно сказать не могу..

worldsering 02.04.2021 14:47

Цитата:

Сообщение от Alexandroppolus (Сообщение 535147)
тут уж ничего сделать не получится.
если у тебя функция, то чем её не обвешивай, а всё равно она останется функцией, а не числом.
и console.log напишет о ней всю правду.

вероятно, эту проблему можно решить через Proxy, пока точно сказать не могу..


Все равно спасибо большое ! очень помог!

destus 02.04.2021 14:50

Alexandroppolus,
вроде одна из вложенных функций лишняя
function number(num) {
    const numberN = function(n1) {
        return number(num * n1);
    }
    numberN.valueOf = function() {
        return num;
    };
    numberN.toString = function() {
        return String(num);
    };
    return numberN;
}

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'));

Alexandroppolus 02.04.2021 14:54

destus,
Точно, с иннером я упоролся. Это фиаско.

Aetae 02.04.2021 18:53

Можно ещё then метод добавить, чтоб делать
const num = await number(1)(2)(3);

И toJSON чтоб в JSON.stringify работало.
:)


Часовой пояс GMT +3, время: 22:43.