Funkcje jako argumenty i wartość zwracana w JS

0

Hej, mam dwa pytania dotyczące funkcji JavaScript.

Pytanie pierwsze: Jaka jest różnica pomiędzy przekazaniem funkcji jako argument do innej funkcji, a jej zwykłym wywołaniem w tej funkcji?
Gdzieś przeczytałem, że w JS można przekazywać funkcje jako argumenty do innych funkcji, więc przykładowo napisałem poniższy skrypt:

function getData(number, FunctionOne, FunctionTwo){
            if(number >= 0){
                FunctionOne();
            }
            else{
                FunctionTwo();
            }
        }

        function FunctionPlus(){
            console.log("To jest funkcja plusowa");
        }
        function FunctionMinus(){
            console.log("To jest funkcja minusowa");
        }

        getData(1, FunctionPlus, FunctionMinus);

Skrypt jedyne co robi, to wywołuje funkcję getData, która jako argument pobiera liczbę i dwie funkcje FunctionPlus i FunctionMinus. Następnie w zależności czy liczba jest większa od 0, jest wywoływana odpowiednia funkcja. Jednak zrobiłem też drugą wersję tego skryptu:

function getData(number){
            if(number >= 0){
                FunctionMinus();
            }
            else{
                FunctionPlus();
            }
        }

        getData(1);

        function FunctionPlus(){
            console.log("To jest funkcja plusowa");
        }
        function FunctionMinus(){
            console.log("To jest funkcja minusowa");
        }

Skrypt działa w zasadzie w identyczny sposób, jednak zamiast przekazywać funkcje przez argument, po prostu wywołałem je w funkcji getData. I teraz czy może mi ktoś wytłumaczyć, jaka jest ogólnie idea przekazywania funkcji przez argument do innej funkcji, skoro mogę ją bezpośrednio wywołać, tak jak w kodzie nr 2? Chyba, że tutaj pokazałem jakiś "ułomny" przykład, ale w rzeczywistości wydaje mi się, że przekazywanie funkcji przez argument jest bardzo przydatne i często stosowane.

Drugie pytanie dotyczy zwracania funkcji przez inną funkcję. Do czego to się może przydać? Tutaj nawet nie jestem w stanie wymyślić jakiegokolwiek przykładu, ale wiem że w JS funkcje mogą zwracać inne funkcje i mimo tego, że wiem jak to zrobić, to nie widzę żadnego powodu, aby zwracać funkcję za pomocą słowa kluczowego return (tj. nie czuję idei, po co to robić i do czego to się może przydać). Mógłby mi ktoś to wyjaśnić i ewentualnie poratować jakimś prostym przykładem?

2

Powód, dla którego Twój drugi przykład działa jest taki, że FunctionPlus i FunctionMinus są widoczne z getData, tj. są w tym samym scope. W dodatku przykład 2 uwidacznia tzw. hoisting, czyli deklaracje zmiennych i funkcji są przenoszone na górę do globalnego scope, albo do zasięgu funkcji.

Funkcję przekazujesz przez parametr, gdy nie jest dostępna w tym samym scope, i/lub gdy chcesz móc przekazać dowolną funkcję do innej (przekazywać funkcję przez parametr). W przykładzie 2 nie ma takiej możliwości, zawsze będzie użyta FunctionPlus lub FunctionMinus, w zależności od number.

0

No dobra, a czy mógłbyś mi jeszcze wytłumaczyć pytanie nr 2, tj. jaka jest idea zwracania funkcji przez funkcję?

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