Упрощенно, DOM-дерево строится следущим образом:
HTML-документ просматривается от начала до конца, попутно на основе тегов строя DOM-дерево. Как только будет найден тег
<script></script>
, просмотр приостановится до завершения этого скрипта. Вы спрашиваете, что плохого может случится, если этот тег находится перед
</body>
. Тут можно рассмотреть ситуацию чуть сложнее: что, если у нас есть два тега со скриптами? И что, если тот скрипт, что расположен ниже, достраивает DOM-дерево, а первый должен обратиться к новым элементам? Тогда и пригождается
DOMContentLoaded
. Если обернуть в
document.addEventListener('DOMContentLoaded', ...);
логику первого скрипта, он дождется, пока второй скрипт закончит работу, после чего запустится сам. Та же ситуация, когда вторым скриптом идет подключаемая библиотека. Если первый скрипт использует ее, сценарий завершится ошибкой.
Ну а если мы говорим про страницу с одним скриптом - разницы нет. Но кто гарантирует, что вы позже не подключите библиотеку или не решите добавить еще один скрипт? Лучше продумывать такие тонкости заранее, чтобы часами не искать ошибку.