Wybierz poprawną definicję funkcji w języku JavaScript.
A.
nazwa_funkcji(argumenty) {instrukcje;}
B.
function nazwa_funkcji(argumenty) {instrukcje;}
C.
new nazwa_funkcji(argumenty) {instrukcje;}
D.
typ_funkcji nazwa_funkcji(argumenty) {instrukcje;}
Pytanie z egzaminu CKE, czerwiec 2019 (arkusz E.14-X-19.06).
W JavaScript klasyczna deklaracja funkcji ma postać: function nazwa_funkcji(argumenty) { instrukcje; }. Słowo kluczowe function informuje interpreter, że definiujemy blok kodu, który można później wywołać po nazwie. Nazwa funkcji powinna opisywać jej zadanie, np. obliczPole(), pokazKomunikat() albo pobierzDaneUzytkownika(). W nawiasach podaje się parametry, czyli dane wejściowe, a w nawiasach klamrowych umieszcza się instrukcje wykonywane po wywołaniu funkcji. Przykładowo: function dodaj(a, b) { return a + b; } pozwala wielokrotnie użyć tego samego fragmentu logiki bez kopiowania kodu. Moim zdaniem to jedna z najważniejszych podstaw JS, bo funkcje są używane przy obsłudze zdarzeń, walidacji formularzy, pracy z DOM i komunikacji z API. W standardowym JavaScript nie podaje się typu zwracanego przed nazwą funkcji, jak w C++ czy Javie. Dobrą praktyką jest nadawanie czytelnych nazw, ograniczanie odpowiedzialności funkcji do jednego zadania oraz zwracanie wyniku przez return, jeśli funkcja ma coś obliczyć. Warto też pamiętać, że deklaracje funkcji są podnoszone, czyli można je wywołać nawet przed miejscem ich zapisania w pliku, choć w dużych projektach lepiej i tak trzymać kod w logicznym porządku.
W JavaScript łatwo pomylić składnię funkcji z innymi językami, zwłaszcza gdy ktoś wcześniej pisał w C, C++ albo Javie. Zapis z typem przed nazwą funkcji wygląda znajomo, ale w JS nie deklaruje się typu zwracanego w ten sposób. Nie piszemy więc czegoś w stylu int suma(a, b) ani typ_funkcji nazwa(argumenty). JavaScript jest językiem dynamicznie typowanym, więc typ wartości wynika z tego, co funkcja faktycznie zwróci w czasie działania programu. Jeśli potrzebna jest kontrola typów, w praktyce używa się TypeScriptu albo dokumentacji JSDoc, ale to nadal nie jest taka sama składnia jak w językach kompilowanych.
Słowo new też ma zupełnie inne zastosowanie. Używa się go do tworzenia obiektu na podstawie konstruktora albo klasy, na przykład new Date() lub new Osoba(). Nie służy ono do deklarowania funkcji. Zapis new nazwa_funkcji(argumenty) { instrukcje; } jest składniowo błędny, bo po wywołaniu konstruktora nie dopisuje się bloku instrukcji definiującego funkcję. To częsty błąd myślowy: ktoś kojarzy, że funkcje mogą tworzyć obiekty, więc próbuje połączyć definicję i tworzenie instancji w jednym zapisie. Tak to nie działa.
Sam zapis nazwa_funkcji(argumenty) { instrukcje; } również nie jest poprawną samodzielną deklaracją funkcji w zwykłym kodzie JavaScript. Co prawda podobny skrót pojawia się w metodach obiektów lub klas, na przykład w obiekcie można mieć metoda() { ... }, ale poza takim kontekstem interpreter oczekuje słowa function, przypisania do zmiennej albo składni funkcji strzałkowej. Poprawne warianty to na przykład function test() { ... }, const test = function() { ... } albo const test = () => { ... }. W codziennej pracy trzeba więc patrzeć nie tylko na same nawiasy i klamry, ale też na kontekst składniowy. To drobiazg, ale potem oszczędza dużo czasu przy debugowaniu.
Słowo new też ma zupełnie inne zastosowanie. Używa się go do tworzenia obiektu na podstawie konstruktora albo klasy, na przykład new Date() lub new Osoba(). Nie służy ono do deklarowania funkcji. Zapis new nazwa_funkcji(argumenty) { instrukcje; } jest składniowo błędny, bo po wywołaniu konstruktora nie dopisuje się bloku instrukcji definiującego funkcję. To częsty błąd myślowy: ktoś kojarzy, że funkcje mogą tworzyć obiekty, więc próbuje połączyć definicję i tworzenie instancji w jednym zapisie. Tak to nie działa.
Sam zapis nazwa_funkcji(argumenty) { instrukcje; } również nie jest poprawną samodzielną deklaracją funkcji w zwykłym kodzie JavaScript. Co prawda podobny skrót pojawia się w metodach obiektów lub klas, na przykład w obiekcie można mieć metoda() { ... }, ale poza takim kontekstem interpreter oczekuje słowa function, przypisania do zmiennej albo składni funkcji strzałkowej. Poprawne warianty to na przykład function test() { ... }, const test = function() { ... } albo const test = () => { ... }. W codziennej pracy trzeba więc patrzeć nie tylko na same nawiasy i klamry, ale też na kontekst składniowy. To drobiazg, ale potem oszczędza dużo czasu przy debugowaniu.