Dlaczego tak
Skrypt w sekcji head wykonuje się w chwili wczytania, gdy element button jeszcze nie istnieje, więc getElementById('btn') zwraca null, a próba odczytu jego metody kończy się błędem TypeError. Rozwiązaniem jest przeniesienie skryptu przed </body>, użycie atrybutu defer albo zdarzenia DOMContentLoaded. Średnik jest tu obecny, a addEventListener działa na każdym elemencie DOM.