Puoi inserirlo dove preferisci come diceva Carlo, a patto che non ci sia un runtime (esecuzione del codice) la cui esecuzione richiede la esistenza di parti della pagina html destinate ad essere modificate o a fornire dati allo script.
Se tu hai una funzione, la definizione della funzione ad esempio
function foo(){alert('ciao');}
può andare dove preferisci. La sua invocazione invece cioè
foo()
deve essere invocata sempre dopo che la definizione della funzione è già stata caricata in memoria, ed è questo e non altro il motivo per cui a scopi meramente cautelativi si preferisce dire che gli script vanno nell' head, che sta in cima ad una pagina. In realtà quello che si intende dire è che le DEFINIZIONI delle funzioni starebbero meglio nell' head, NON le loro invocazioni.
Inoltre, se la definizione della funzione manipola oggetti html, allora la sua invocazione deve avvenire E dopo che la definizione della funzione è già stata caricata in memoria, E dopo gli oggetti html che manipola, esempio
<head>
<script>
function foo(){alert(document.nomeform.elements.length);}
</script>
</head>
<body>
<form name="nomeform"><input type="text" /> <input type="checkbox" />
</form>
bla bla bla
<script>
foo();/*qui, DOPO che la form nomeform che la funzione usa è stata caricata tutta in memoria*/
</script>
bla bla bla
</body>
Tebuto fermo questo principio, puoi piazzare anche le definizioni dove credi a patto che le loro invocazioni o runtime avvengano solo DOPO che gli eventuali oggetti html che manipolano siano già stati caricati in memoria.
In termini di benchmark diciamo cioè di velocità di caricamento non fa una gran differenza. In linea di massima un js esterno nell' head è caricato un po' più velocemente che se messo in altra maniera, ma si tratta di variazioni marginali di scarso impatto pratico: un js che fosse, faccio per dire, 300KB rallenterebbe la pagina comunque lo piazzi.
Per il javascript non incapsulato da funzioni, che so un ciclo for esterno ad una funzione, puoi piazzarlo dove vuoi ma vale la stessa cautela: se ispeziona elementi della pagina web, allora deve essere stampato dopo che tali elementi sono già stati caricati in memoria.