Loading...
a.angelov avatar a.angelov 1316 Точки

[Homework] Advanced JS - Functions and function expressions - Problem{4} Adding Numbers Using Functions

Някой реши ли тази задача... Нещо не мога да схвана условието и по-конкретно подаването на входа:

add(1)(0)(-1)(-1)

Какво се има в предвид, че последователно ще бъде извикано add(1), add(0), add(-1) и add(-1) ли?

Тагове:
3
JavaScript Advanced 04/03/2015 12:58:07
Filkolev avatar Filkolev 4482 Точки

Ми явно това е начинът, мислех, че може да има нещо по-хитро с рекурсията ама щом Stackoverflow казва така значи няма какво да го мислим повече.

1
a.angelov avatar a.angelov 1316 Точки

Най-чист ми се видя като че ли този вариант. Но пак за да се изпечата резултата трябва да се обърне към число с +:

function add(a) {
    var sum = a;

    function addInner(b) {
        sum += b;
        return addInner;
    }

        addInner.toString = function() {
            return sum;
        };

    return addInner;
}

var addTwo = add(2);
console.log(+addTwo); //2

var addTwo = add(2);
console.log(+addTwo(3)(5)(1)(7)); //18

3
05/03/2015 13:49:19
atanasovam avatar atanasovam 39 Точки

Тва с плюса ми изглежда като някакъв хак, ама не мога да измисля/намеря нещо друго, което да върши работа... В browser-а всичко си работи, ама в node.js се чупи нещо.

1
Filkolev avatar Filkolev 4482 Точки

Нещо подобно Данчо показа вчера на лекция, където функцията връща друга функция, например (за събиране на точно две числа):

function add(num) {

      return function addAgain(h) {

        return num + h;
    }
}


console.log(add(1)(2)); // 3

Тук явно трябва да има някаква рекурсия, но не мога да разбера как да спра да викам функцията ако искам вече да видя резултата.

Никак не е окуражаващо, че още в първото домашно всичко ми е каша.

6
a.angelov avatar a.angelov 1316 Точки

Хм, благодаря, представих си какво се иска в задачата, остава да измисля как да го направя :)

0
Filkolev avatar Filkolev 4482 Точки

И на мен уж ми е горе-долу ясно, ама не мога да измисля как да проверя кога функцията трябва да върне стойност и кога да върне функция. Имаше нещо в предния курс по JS как една променлива може да се ползва като таква и едновременно с това като функция, но трябва да прегледам пак лекцията, мисля, че Христо Чакъров тогава обясни нещо такова.

Нека някой ако разбере как става да даде линк към приличен ресурс по темата.

1
04/03/2015 14:50:59
a.angelov avatar a.angelov 1316 Точки

Да - точно това е проблема, как да посочим кога да върне стойност и кога closure-а. А иначе задачата е без звездичка... :)

0
04/03/2015 14:59:40
Pavel_R avatar Pavel_R 57 Точки

Аз измислих нещо такова:

var add = (function() {
var sum = 0;

function add(increment) {
sum += increment;
return add;
}

add.toString = function() {
return sum;
}

return add;
})();

 

Просто се овъррайдва toString

1
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Аз намерих ето това: 

function add(n) {
    var v = function (x) {
        return add(n + x);
    };

    v.valueOf = v.toString = function () {
        return n;
    };

    return v;
}

var addTwo = +add(2);
console.log(addTwo); //2

var addTwo = add(2);
console.log(+addTwo(3)(5)(1)(7)); //18
6
04/03/2015 18:12:41
Pavel_R avatar Pavel_R 57 Точки

Да, този пример работи по-коректно от този който по-горе съм дал. Бравос :)

0
mihayloff14 avatar mihayloff14 824 Точки

В случая valueOf би трябвало да override-ва един вид "setter"-а на тази фунция поради липсата на по-добро обяснение. Един вид по този начин може да се използва add(2) + add(3) или примерно add(3)++?

0
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Това е обяснението на автора на решението:

The + casts the result of sum() to number. In that case JavaScript calls the .valueOf method of an object. Since I'm returning anonymous function, this helps to convert it to primitive type. As you can see, I overwrote the native .valueOf with my own.

3
mihayloff14 avatar mihayloff14 824 Точки

Аз да ви попитам как сте направили трета задача свързана с различното поведение на this?

Тъй като в момента се занимавам с нея и при различното извикване на this от функцията няма никаква разлика и винаги връща глобалния scope, тоест window-а, но очевидно не е това което се иска да се постигне в задачата?

Ето и това, което съм написал:

http://pastebin.com/Mgc8K5Vf

0
04/03/2015 20:22:19
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Аз го направих ето така и също се чудех дали това искат в условието:

function testContext() {
    console.log(this);
}

console.log("-==== Call from global scope: ====-");
testContext();

console.log("-==== Call inside another function: ====-");
callFromFunc();

function callFromFunc() {
    testContext();
}

console.log("-==== Call as an object: ====-");
var a = new testContext();
0
04/03/2015 20:28:09
mihayloff14 avatar mihayloff14 824 Точки

А имаше ли някаква разлика в поведението при различните случаи?

0
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Ами в първите два случая връщи глобалния score, а като правя инстанция ми връща {} и заради това не знам дали това се очаква...

0
martin_n_marinov avatar martin_n_marinov 26 Точки

Първо, благодаря на Vacheva за четивото!!!

Виждам, че повечето хора са я решили със toString(), но мисля че по-добра идея е това :

addFunction

Макар че не е точно както се иска, защото трябва накрая да се викне без параметри, но според мен е по логично.

Приклучва function pipa и връщаме резултат ? 

console.log(add(2)(3)()); // 5

или

var addTwo = add(2)();
console.log(addTwo);  // 2

1
10/03/2015 06:40:49
Vacheva avatar Vacheva 154 Точки

Четивото го дадох като ориентир за 5 задача, но важи и за 4-та, която вече се бях отказала да мъча. Благодаря за примера.

1
10/03/2015 17:20:16
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.