W tym kodzie funkcja wyswietlNazwisko(nazwisko) jest poprawnie zadeklarowana, a komunikat przekazywany do alert() też jest w porządku. Problem wcale nie leży w samej funkcji, tylko w tym, że wywołujemy ją z argumentem nazwisko, który nigdzie wcześniej nie został zdefiniowany ani nie ma do niego przypisanej żadnej wartości. Silnik JavaScript widzi wywołanie wyswietlNazwisko(nazwisko); i szuka zmiennej o nazwie nazwisko w aktualnym zasięgu (scope). Ponieważ jej nie znajduje, zgłasza błąd ReferenceError: nazwisko is not defined. To jest klasyczny przypadek braku inicjalizacji zmiennej przed użyciem. W praktyce, żeby to naprawić, trzeba najpierw zadeklarować zmienną, np.: var nazwisko = "Kowalski"; albo let nazwisko = prompt("Podaj swoje nazwisko:"); i dopiero potem wywołać funkcję: wyswietlNazwisko(nazwisko);. Dobra praktyka w JavaScript to zawsze jawne deklarowanie zmiennych przy użyciu let lub const (ewentualnie var w starszym kodzie) oraz nadawanie im czytelnych, przewidywalnych wartości początkowych. W aplikacjach webowych takie zmienne często pochodzą z pól formularza, np. z document.getElementById("nazwisko").value, i dopiero ta wartość jest przekazywana jako argument funkcji. Moim zdaniem warto wyrobić sobie nawyk, że zanim użyjesz jakiejś nazwy w wywołaniu funkcji, sprawdzasz, czy na pewno istnieje jej deklaracja w odpowiednim zasięgu i czy ma sensowną wartość. Dzięki temu unikniesz wielu irytujących błędów w konsoli i łatwiej będzie debugować kod.
Kod z ilustracji bardzo dobrze pokazuje typowy błąd początkujących w JavaScript: pomylenie deklaracji funkcji i zmiennych z ich użyciem. Przeglądarka zgłasza błąd ReferenceError: nazwisko is not defined, co wyraźnie sugeruje, że problem dotyczy zmiennej, a nie funkcji czy argumentu alert(). Funkcja wyswietlNazwisko(nazwisko) jest poprawnie zdefiniowana: ma słowo kluczowe function, nazwę, parametr w nawiasach i blok w klamrach. Samo istnienie tej definicji powoduje, że przeglądarka wie, czym jest wyswietlNazwisko, więc nie można mówić, że funkcja nie została zadeklarowana. Częstym błędnym skojarzeniem jest też traktowanie nazwiska w wywołaniu wyswietlNazwisko(nazwisko); jakby odnosiło się do tego samego nazwiska z nagłówka funkcji. Tymczasem to są dwie różne rzeczy: parametr funkcji istnieje dopiero wewnątrz funkcji i jest wypełniany wartością przekazaną przy wywołaniu. Jeśli przy wywołaniu podajemy nazwę zmiennej, to ta zmienna musi być wcześniej zdefiniowana w aktualnym zakresie. Tu jej nie ma, więc interpreter się „gubi”. Nie jest też prawdą, że argument do alert() jest nieprawidłowy. Funkcja alert() dostaje zwykły łańcuch znaków zapisany w zmiennej komunikat, a ten łańcuch jest zbudowany z tekstu stałego i parametru nazwisko. Gdyby zmienna nazwisko była poprawnie przekazana, alert działałby dokładnie tak, jak oczekujemy. Tak samo nie ma żadnego wymagania, żeby funkcję wyswietlNazwisko wywoływać tylko wewnątrz innej funkcji. W JavaScript można wywołać funkcję zarówno wprost w skrypcie, jak i z poziomu zdarzenia (onclick, onload itd.) – to kwestia logiki aplikacji, a nie wymóg języka. Kluczowe jest zrozumienie zasięgu zmiennych i tego, że każda użyta nazwa musi mieć wcześniej nadaną wartość, inaczej pojawi się właśnie taki ReferenceError.