Oi, Tom, tudo bem?
Basicamente é isso mesmo, certinho sua observação.
De fato quando o navegador encontra um <script> no <head> sem defer, ele interrompe a leitura do HTML para baixar e executar o JavaScript. Se o código tentar acessar algum elemento que ainda não foi carregado no <body>, isso acaba gerando erro. Já ao usar o atributo defer, o navegador continua lendo o HTML enquanto baixa o script em paralelo, e só executa o código depois que a página estiver completamente carregada. Colocar o script no final do <body> também resolve, porque nesse momento todos os elementos já estão disponíveis, permitindo que o JavaScript funcione sem problemas.
Hoje em dia, o uso de defer é considerado a melhor prática, pois garante que o script comece a ser baixado mais cedo sem interromper a renderização da página. Continue com essa curiosidade e atenção aos detalhes, isso faz toda a diferença no aprendizado!
Bons estudos e muito sucesso ✨