Na egzaminie cały kod JavaScript siedzi w funkcjach. Funkcja uruchamia się, gdy użytkownik kliknie przycisk, pobiera dane, liczy wynik i go zwraca. Dziś nauczysz się funkcje tworzyć, przekazywać im dane i odbierać od nich wynik. Każdy kod możesz uruchomić przyciskiem Uruchom albo skrótem Ctrl+Enter.
Funkcja to nazwany fragment kodu, który możesz uruchomić w dowolnym momencie i dowolnie wiele razy. Zamiast kopiować te same linijki w kilka miejsc, zapisujesz je raz i nadajesz im nazwę.
Funkcja działa jak przepis kulinarny:
| Przepis | Funkcja | Przykład |
|---|---|---|
| zapisanie przepisu | definicja: opisujesz, co robić | function brutto(netto) { … } |
| składniki | parametry: dane wejściowe | netto |
| gotowanie | wywołanie: uruchomienie funkcji | brutto(100) |
| gotowe danie | wynik oddany przez return | 123 |
Funkcję tworzysz słowem function. Sama definicja jeszcze nic nie robi, bo przepis trzeba „ugotować”. Funkcję uruchamiasz, pisząc jej nazwę i nawiasy ().
function nazwaFunkcji() { // definicja: przepis
// kod funkcji
}
nazwaFunkcji(); // wywołanie: gotowanie
Bez nawiasów () funkcja się nie uruchomi. Nazwy piszemy jak zmienne: małą literą, kolejne słowa wielką (obliczCene, pokazWynik), najlepiej czasownikiem.
Ile razy wypisze się „Hej”?
function hej() {
console.log("Hej");
}
hej;
hej();
Linijka hej; bez nawiasów tylko wskazuje funkcję, ale jej nie uruchamia. Funkcję wywołuje dopiero hej();.
Funkcja staje się naprawdę przydatna, gdy może dostać dane. W nawiasie definicji wypisujesz parametry, czyli nazwy, pod którymi funkcja odbierze wartości. Przy wywołaniu podajesz argumenty, czyli konkretne wartości.
Kolejność ma znaczenie: pierwszy argument trafia do pierwszego parametru, drugi do drugiego. Parametry oddzielasz przecinkami i piszesz bez cudzysłowów, bo to nazwy, a nie wartości.
To najważniejsza część lekcji. console.log tylko pokazuje wartość w konsoli. return oddaje wynik do miejsca, w którym funkcję wywołano. Ten wynik możesz zapisać do zmiennej, dodać do czegoś albo przekazać dalej.
function brutto(netto, vat) {
return netto * (1 + vat);
}
function brutto(netto, vat) {
let wynik = netto * (1 + vat);
return wynik;
}
let cena = brutto(100, 0.23);
console.log(cena);
function nazwa(parametr1, parametr2) {
// obliczenia
return wynik;
}
let zmienna = nazwa(argument1, argument2);
console.log pokazuje, return oddaje. Funkcje liczące prawie zawsze kończą się return. Wywołanie funkcji z return możesz traktować jak zwykłą wartość.
return natychmiast kończy funkcję, więc kod pod nim już się nie wykona. Dzięki temu możesz zwracać różne wyniki w różnych gałęziach if:
Co wypisze ten kod?
function podwoj(x) {
console.log(x * 2);
}
let w = podwoj(5);
console.log(w);
Funkcja wypisuje 10, ale niczego nie zwraca, bo nie ma return. Funkcja bez return oddaje undefined, więc w zmiennej w ląduje undefined.
Zmienne utworzone wewnątrz funkcji (także jej parametry) są lokalne: istnieją tylko podczas działania funkcji i nie widać ich na zewnątrz. Zmienne utworzone poza funkcjami są globalne, więc funkcja może z nich korzystać.
Co w funkcji, to zostaje w funkcji. Wynik wyprowadzasz na zewnątrz przez return, a nie przez zmienną lokalną.
Wzorce z poprzedniej lekcji (suma, średnia, maksimum) najlepiej zamknąć w funkcjach. Wtedy działają dla każdej tablicy, a jedna funkcja może korzystać z drugiej.
Funkcja może też zwracać true albo false. Takie funkcje nazywamy zwykle od czy… i wstawiamy prosto do if:
Na egzaminie wystarczy klasyczne function. W kodzie z internetu spotkasz jednak dwa inne zapisy. Działają tak samo:
| Zapis | Przykład |
|---|---|
| deklaracja | function kwadrat(x) { return x * x; } |
| wyrażenie funkcyjne | const kwadrat = function(x) { return x * x; }; |
| funkcja strzałkowa | const kwadrat = (x) => x * x; |
Na INF.03 funkcję prawie zawsze uruchamia kliknięcie przycisku. W HTML-u przycisk dostaje atrybut onclick z wywołaniem funkcji, a funkcja jest zdefiniowana w skrypcie:
<!-- HTML --> <button onclick="oblicz()">Oblicz</button> <!-- skrypt --> <script> function oblicz() { // 1. pobierz dane z formularza // 2. policz wynik // 3. pokaż wynik na stronie } </script>
Punkt 2 już umiesz. Punkty 1 i 3, czyli pobieranie danych z pól formularza i wyświetlanie wyniku na stronie, poznasz na następnej lekcji.
| Błąd | Objaw | Poprawka |
|---|---|---|
| oblicz; | nic się nie dzieje | wywołanie z nawiasami: oblicz(); |
| console.log zamiast return | wynik w zmiennej to undefined | zakończ funkcję return wynik; |
| kod pod return | linijki pod return nigdy się nie wykonują | return jako ostatnia instrukcja |
| function f("x") | SyntaxError | parametry bez cudzysłowów: function f(x) |
| zmienna lokalna poza funkcją | ReferenceError: … is not defined | zwróć wartość przez return i zapisz ją w zmiennej |
| Oblicz() a oblicz | ReferenceError: Oblicz is not defined | wielkość liter w nazwie musi się zgadzać |
W każdym zadaniu napisz funkcję o podanej nazwie. Sprawdzarka sama wywoła ją z różnymi argumentami i porówna wynik, który zwróci return. Pod funkcją możesz dopisywać własne wywołania z console.log, żeby ją przetestować; sprawdzarka ich nie ocenia.
Napisz funkcję obliczBrutto(netto), która zwraca cenę brutto przy VAT 23%. Dla 100 ma zwrócić 123.
function obliczBrutto(netto) {
return netto * 1.23;
}
Napisz dwie funkcje: pole(a, b) zwracającą pole prostokąta i obwod(a, b) zwracającą jego obwód.
function pole(a, b) {
return a * b;
}
function obwod(a, b) {
return 2 * (a + b);
}
Napisz funkcję czyPelnoletni(wiek), która zwraca true dla osoby, która ma co najmniej 18 lat, a w przeciwnym razie false.
function czyPelnoletni(wiek) {
return wiek >= 18;
}
Napisz funkcję ocena(punkty), która zwraca ocenę jako liczbę: 0–39 → 1, 40–54 → 2, 55–69 → 3, 70–84 → 4, 85–94 → 5, 95–100 → 6. Użyj kilku return w instrukcjach if.
function ocena(punkty) {
if (punkty >= 95) return 6;
if (punkty >= 85) return 5;
if (punkty >= 70) return 4;
if (punkty >= 55) return 3;
if (punkty >= 40) return 2;
return 1;
}
Napisz funkcję srednia(tab), która zwraca średnią liczb z tablicy. Dla pustej tablicy ma zwrócić 0, bo nie wolno dzielić przez zero.
function srednia(tab) {
if (tab.length === 0) {
return 0;
}
let suma = 0;
for (const x of tab) {
suma += x;
}
return suma / tab.length;
}
Ta funkcja ma wypisywać, a nie zwracać. Napisz powitanie(imie, godzina), która przed 18:00 wypisuje Dzień dobry, Ola!, a od 18:00 Dobry wieczór, Ola! (z podanym imieniem).
function powitanie(imie, godzina) {
if (godzina < 18) {
console.log("Dzień dobry, " + imie + "!");
} else {
console.log("Dobry wieczór, " + imie + "!");
}
}
Napisz funkcję kosztPaliwa(km, spalanie, cena), która zwraca koszt paliwa na trasę: km to długość trasy, spalanie to litry na 100 km, cena to cena litra. Następnie napisz funkcję kosztNaOsobe(km, spalanie, cena, osoby), która korzysta z kosztPaliwa i zwraca koszt przypadający na jedną osobę.
function kosztPaliwa(km, spalanie, cena) {
let litry = km / 100 * spalanie;
return litry * cena;
}
function kosztNaOsobe(km, spalanie, cena, osoby) {
return kosztPaliwa(km, spalanie, cena) / osoby;
}
function przywitaj() {
console.log("Cześć!");
}
przywitaj();Bez nawiasów () funkcja się nie uruchomi.
function pole(a, b) { … }
pole(5, 3); // a = 5, b = 3Kolejność ma znaczenie. Parametry bez cudzysłowów.
function brutto(n) {
return n * 1.23;
}
let cena = brutto(100);console.log pokazuje, return oddaje. Kod pod return się nie wykona.
function opis(t) {
if (t < 0) return "mróz";
if (t < 25) return "ok";
return "upał";
}Pierwszy wykonany return kończy funkcję.
const VAT = 0.23; // globalna
function f() {
let x = 1; // lokalna
}Co w funkcji, to zostaje w funkcji.
<button onclick="oblicz()">
function oblicz() { … }Przycisk wywołuje funkcję. W onclick nazwa z nawiasami.
Na następnej lekcji: DOM, czyli pobieranie danych z formularza (getElementById, .value) i wyświetlanie wyniku na stronie (innerHTML).