Eu queria soluções com o máximo possível de suporte para navegadores antigos. Caso contrário, eu diria que tanto o currentScript quanto o método de atributos de dados seriam mais elegantes.
Este é o único desses métodos que ainda não foi mencionado aqui. Particularmente, se por algum motivo você tiver grandes quantidades de dados, a melhor opção pode ser:
localStorage
<script>
localStorage.setItem('data-1', 'I got a lot of data.');
localStorage.setItem('data-2', 'More of my data.');
localStorage.setItem('data-3', 'Even more data.');
</script>
var data1 = localStorage.getItem('data-1');
var data2 = localStorage.getItem('data-2');
var data3 = localStorage.getItem('data-3');
O localStorage tem suporte completo a navegadores modernos e também um suporte surpreendentemente bom para navegadores mais antigos, desde o IE 8, Firefox 3,5 e Safari 4 [onze anos atrás], entre outros.
Se você não tem muitos dados, mas ainda deseja amplo suporte ao navegador, talvez a melhor opção seja:
Meta tags [por Robidu]
<meta name="yourData" content="Your data is here" />
var data1 = document.getElementsByName('yourData')[0].content;
A falha disso é que o lugar correto para colocar metatags [até HTML 4] é na tag head, e você pode não querer esses dados lá. Para evitar isso, ou colocar metatags no corpo, você pode usar:
Parágrafo oculto
<p hidden id="yourData">Your data is here</p>
var yourData = document.getElementById('yourData').innerHTML;
Para obter ainda mais suporte ao navegador, você pode usar uma classe CSS em vez do atributo oculto:
.hidden {
display: none;
}
<p class="hidden" id="yourData">Your data is here</p>