Funkcje. Argumenty, funkcje wewnątrz funkcji | Funkcja dodająca zadanie addTask()


Wcześniej dodawaliśmy nasze zadania używając tego kodu: tasks.push("jakieś tam zadanie"). Zwróć uwagę na to, że "jakieś tam zadanie" znajduje się w nawiasach funkcji, w związku z tym "jakieś tam zadanie" zostało przekazane do metody push() jako argument (pewien zasób/ wartość/ informacja), który zostanie przez tę funkcję wykorzystany.

Nasza (na razie jedyna) funkcja showTasks() nie ma żadnych argumentów w nawiasach, ponieważ ich nie potrzebuje - ma dostęp do zadań, gdyż zmienna tasks istnieje już w naszym kodzie i zawsze mamy do niej dostęp z poziomu każdej funkcji (innymi słowy, jest zmienną globalną). Czyli wiemy już, że funkcja może w ogóle nie mieć żadnych argumentów.

Wyobraźmy natomiast, że chcemy dodać nowe zadanie, które nie istnieje nigdzie w kodzie w postaci zmiennej, wiemy także, że dysponujemy funkcją o nazwie addTask() (za chwilę ją napiszemy, ale na razie wyobraźmy, że ktoś już ją napisał). Jak możemy to zrobić?

W tym przypadku należałoby tej funkcji przekazać pewną informację (w naszym przypadku będzie to nowe zadanie), czego możemy dokonać poprzez wpisanie naszego zadania w nawiasach tej funkcji w następujący sposób: addTask("zrobić kawę po raz drugi").

Chciałbym też zauważyć, że taki kod zadziała tylko w tym przypadku, jeśli funkcja addTask() oczekuje jakiegoś argumentu, czyli została napisana w sposób, przedstawiony poniżej:

function addTask(newTask) {
    // w poniższej linijce dodajemy zadanie do listy zadań,
    // w taki sam sposób, jak robiliśmy to wcześniej:
    tasks.push(newTask);

    // dodatkowo wyświetlamy komunikat w konsoli o nowo dodanym zadaniu:
    console.log("Do Twoich zadań zostało dodane nowe zadanie:", newTask);

    // wyświetlamy zaktualizowaną pełną listę zadań,
    // używając zdefiniowanej wcześniej funkcji showTasks():
    showTasks();
}

Przeczytaj ten powyższy kod i spróbuj najpierw intuicyjnie zrozumieć, co się w nim dzieje oraz dopisz go do pliku todo-app na samym końcu (ale przepisz własnoręcznie, nie kopiuj tego kodu!). No i oczywiście zapisz zmiany skrótem Ctrl+S, a potem kliknij ikonkę trójkąta lub kolejny skrót Ctrl+Enter, by kod zadziałał w przyszłości w konsoli.

Po pierwsze, zwróć uwagę, że po nazwie funkcji addTask w nawiasach mamy zawarty argument newTask. Tak naprawdę newTask jest zmienną, która jeszcze nie ma żadnej przypisanej wartości, czyli jest to "puste podpisane pudełko", swego rodzaju pośrednik, do którego dopiero później coś włożymy - a dokładnie w momencie wywołania funkcji w ten sposób: addtask("to zadanie jest właśnie tą wartością, która zostanie przypisana do argumentu newTask").

Mimo że w samej definicji funkcji addTask argument newTask nie ma żadnej wartości, to możemy go wykorzystać w kodzie funkcji tak, jakby tę wartość miał (co też robimy w dalszej części kodu funkcji: tasks.push(newTask) - tak naprawdę mówimy przeglądarce, że cokolwiek by się znalazło z zmiennej newTask, powinno zostać dodane do tasks).

Innymi słowy, wyobraź sobie, że mówisz koleżance z biura: "Na biurku leży żółty segregator, który na razie jest pusty, ale później przyjdzie sekretarka i włoży do tego segregatora stertę dokumentów. Wtedy weź segregator i włóż go do szafy". Koleżanka nie musi wiedzieć, jakie dokumenty znajdą się w segregatorze. Wie tylko, że jak się tam znajdą, trzeba odłożyć segregator w określone miejsce. Gdyby wspomniana koleżanka bardzo się nudziła, mogłaby wziąć pusty segregator i włożyć go do szafy, mimo że nie ma w nim żadnych dokumentów, by przećwiczyć tę czynność na przyszłość.

Po drugie, zauważ, że w funkcji addTask() nie tylko dodajemy zadanie do listy, ale także wyświetlamy komunikat w konsoli o tym, że zostało dodane nowe zadanie, przy czym wyświetlamy także samo zadanie. Dzieje się tak dlatego, że tym razem przekazaliśmy console.log() zarówno pewną wiadomość: "Do Twoich zadań zostało dodane nowe zadanie:", a potem po przecinku przekazaliśmy samą zmienną, reprezentującą nowe zadanie, w związku z czym konsola wyświetli wiadomość oraz wartość zmiennej przechowującej nowe zadanie (treść nowego zadania):

console.log("Do Twoich zadań zostało dodane nowe zadanie:", newTask);

Po trzecie, po dodaniu nowego zadania i wyświetleniu komunikatu, wywołujemy funkcję showTasks(), którą wcześniej napisaliśmy, dzięki czemu konsola automatycznie wyświetli zaktualizowaną listę zadań z nowo dodanym zadaniem na końcu. Widzisz, mówiłem, że funkcje przydają się do ponownego wykorzystania! W funkcji addTask() zawarliśmy i wywołujemy inną naszą funkcję showTasks() (a w sumie wywołujemy też wbudowaną funkcję console.log()).

Być może nawet nie pamiętasz już, co dokładnie znajdowało się w funkcji showTasks(), ale na pewno wiesz, co robi i z tego skorzystałeś/aś! Właśnie na tym polega korzyść z tworzenia dobrze nazwanych reużywalnych funkcji!

Dzięki temu, że dodaliśmy automatyczne wyświetlenie zaktualizowanej listy zadań, nie musimy za każdym razem po dodaniu nowego zadania wywoływać ręcznie dodatkowo showTasks(), żeby wyświetlić naszą listę. Widzisz, ile może się dziać w jednej funkcji!

Ok, dopisz więc do pliku todo-app kod nowej funkcji addTask(), ale bez moich komentarzy (to te linijki, które zaczynają się od //, pamiętasz?), zapisz plik (tak jak zwykle za pomocą Ctrl+S) i uruchom go klikając ikonkę trójkąta lub używając skrótu Ctrl+Enter.

Teraz możemy dodawać zadania poprzez wywołanie funkcji addTask z argumentami (poćwicz to w konsoli):

addTask("sprawdzić Facebooka");
addTask("wyskoczyć do sklepu po jogurt");
addTask("położyć jogurt na grzejniku, by się zacieplił");

Jeśli wszystko poszło zgodnie z planem, to za każdym razem po dodaniu zadania, wyświetla Ci się komunikat oraz coraz to dłuża lista - ileż to my mamy do zrobienia dzisiaj w biurze!