Niezrozumialy program w JavaScript z anonimowa funkcja wewnetrzna

0

Witam, czytam powoli ksiazka "Eloquent JavaScript" - jest dostepna za darmo, z przykladami na stronie. Mam problem ze zrozumieniem jednego przykladu, moze ktos da rade mi to wyjasnic tutaj? Uruchomilem Firebug'a i obserwowalem jakie wartosci przyjmuja kolejne parametry i zmienne. Nie rozumiem skad i jak przekazywana jest wartosc do anonimowej funkcji
"function (element)". Nie jest nigdzie przekazywana zadna wartosc z tego co widze. Reszta ma sens, w funkcji "reduce" "combine" to "add", "base" ustawiony na zero, "array" przekazana do "sum" jest dostepna w funkcji wewnetrznej.

function forEach(array, action) {
        for (var i = 0; i < array.length; i++)
        action(array[i]);
    }

function reduce(combine, base, array) {
        forEach(array, function (element) {
        base = combine(base, element);
        });
    return base;
    }

    function add(a, b) {
        return a + b;
    }

    function sum(numbers) {
        return reduce(add, 0, numbers);
    }
    
    var tempArray = new Array(1, 2, 3);
    sum(tempArray);

dodanie znacznika <code class="javascript"> - fp

0

Przekazujesz ta funkcje jako argument forEach, ktory sobie wywoluje ja z odpowiednim parametrem.

0

Dzieki za odpowiedz, ale obawiam sie, ze nadal nie rozumiem. Funkcje anonimowa przekazuje jako parametr do funkcji "foreach", to rozumiem. Nic jednak nie przekazuje jako parametr do funkcji anonimowej, wiec jak to dziala, ze "element" ma kolejne wartosci tablicy?

2

Trochę inaczej, bo mechanizm domknięć jest mocno uzależniony od języka i choć w JS jest stosunkowo intuicyjny to łatwo się zgubić jeżeli dodamy do tego jeszcze słabe typowanie.
Funkcja forEach przyjmuje dwa parametry. Pierwszy to tablica, a drugi to akcja. Akcja musi być funkcją.

Działa to tak dla każdego elementu tablicy przekazanej w pierwszym argumencie wywołać funkcję przekazaną w drugim przekazując jej jako argument element tablicy.

W naszym przypadku pod action jest wstawiana funkcja "anonimowa" (piszę w nawiasie, bo tak naprawdę jest to obiekt, ale to trochę inna kwestia), która zostaje wywołana z argumentem element.

Zresztą podobną sztuczkę masz wykonaną w przypadku funkcji add, sum i reduce. Ta druga przekazuje trzeciej pierwszą. Tyle tylko, że w tym przypadku add jest nazwane.

0

Mam pytanie do autora tematu czy ty masz tą książkę w języku angielskim czy może polskim

0

Hej, dzieki Koziolek, sam pomysl rozumiem. Rozumiem tez przekazywanie argumentow pomiedzy funkcjami. Wywoluje "sum" z tablica, ta jest przekazana do "reduce" razem z "add" i punktem startowym. Nastepnie "reduce" przekazuje tablice do "foreach", wiec tablica jest tam dostepna. "foreach" chce 2 argumentow i 2 argumenty jej przekazujemy - tablice i funkcje. Teraz ta funkcja chce 1 argument, ale nic jej nie przekazujemy, a mimo to "element" przyjmuje kolejne wartosci tablicy. Czary :/
Innymi slowy, nadal nie chwytam. Da sie to jakos rozpisac, np bez uzycia funkcji anonimowej? Moze wtedy byloby jasniej.

@tomi0001: ksiazka jest dostepna w jezyku polskim i angielskim:
http://eloquentjavascript.net/

1 użytkowników online, w tym zalogowanych: 0, gości: 1