JavaScript no HTML

Podemos usar o elemento <script> para incluir código javascript em uma página html.
Há duas formar de fazer isso:

Algumas informações sobre o elemento <script>: O script externo pode ser incluído no elemento <head> ou <body> do documento HTML.

Render blocking (Bloqueio de renderização)

O browser lê o documento HTML linha por linha, de cima para baixo. Quando a leitura do código chega numa tag script, o broswer fica "travado" na linha até que o arquivo seja BAIXADO e EXECUTADO.
Os elementos HTML somente são inseridos no DOM após serem lidos. Isso significa que para acessarmos eles via JavaScript, eles precisam ser carregados antes dos scrips.

                <div id="acessivel"></div>
                <script src="script.js"></script>
                <div id="inacessivel"></div>
            

Diferença entre <head> e <body> para a inclusão de scripts

IMPORTANTE: Avaliar a iteração do script com os elementos HTML, pois o JS acessa os elementos html via DOM, e isso pode causar bugs.

Atributos do elemento <script>

Atributo src

Atributo text

Atributo type

Atributo integrity

Atributo nomodule

Atributo crossorigin

Atributo defer

Esse atributo Boolean é usado para indicar ao navegador que o script deve ser executado depois que o documento tenha sido parseado, mas antes de disparar o evento DOMContentLoaded (en-US).
Scripts com o atributo defer vão impedir que o evento DOMContentLoaded seja disparado até que o script seja carregado e tenha terminado de ser avaliado. Neste caso, o browser começa a baixar o arquivo sem gerar render blocking, ou seja, ele continua lendo o html, e o script é executado somente depois que todos os elementos html já estão no DOM.

                <script src="script.js" defer></script>
            

Atributo async

References

Web/HTML/Element/script