Po to stworzono zasięg blokowy, żeby nie robić zmiennych o zasięgu funkcyjnym i globalnym. Stąd to drugie podejście uznałbym za niepoprawne wykorzystanie zmiennej let. Co więcej, tworzymy zmienną możliwą do nadpisania tylko i wyłącznie dlatego, że nie chcemy używać zasięgu blokowego! Czyli zamiast jednego problemu, tworzymy od razu dwa.
Dodatkowo obecnie większość kodu jest pisana z myślą o modułach ES, gdzie problem nadpisywania zmiennych de facto nie istnieje. Wszystkie zmienne pozostają wewnątrz modułu i nie wypływają na zewnątrz. Natomiast używanie takich modułów bezpośrednio w przeglądarce (script[type=module]) rozwiązuje też problem odpalania kodu operującego na DOM dopiero po jego wczytaniu. Wszystkie bowiem moduły odpalają się po wczytaniu DOM, w kolejności, w jakiej występują w kodzie (czyli podobnie do tradycyjnych skryptów z parametrem [defer]). Tym samym można zapomnieć o zdarzeniu DOMContentLoaded.