mi troverei a dover caricare la funzione "cambia()" quando l'array "messaggi" ancora non è stato riempito....
Ovviamente non l'hai provato... l'array viene riempito dal server prima di inviare la pagina al browser, ovviamente arrivera' con l'array gia' pieno.
Se usi l'espediente di mette le stringhe in altrettanti campi textarea di un form dovrai solo preoccuparti di fare il trasferimento prima di richiamare cambia()... per esempio con:

<body onload="riempi();cambia()">

ciao