Кто-то попросил меня прокомментировать эту тему, но это было до того, как @lonut опубликовал ответ. Код @ lonut - очень хорошее решение, но у меня есть несколько комментариев (критических и не очень):
Во-первых, код @ lonut предполагает, что сценарии НЕ имеют зависимостей загрузки от других сценариев. Это немного сложно объяснить, поэтому давайте поработаем с простым примером jquery.min.js и prototype.js. Предположим, у нас есть простая страница, которая просто загружает эти два скрипта, например так:
<script src="jquery.min.js"></script>
<script src="prototype.js"></script>
Помните - на странице больше ничего нет - никакого другого кода JavaScript. Если вы загрузите эту страницу, два скрипта будут загружены, и все в порядке. Теперь, что произойдет, если вы удалите скрипт jquery.min.js? Если вы получаете ошибки из prototype.js, потому что он пытается ссылаться на символы, определенные в jquery.min.js, то prototype.js имеет зависимость загрузки от jquery.min.js - вы не можете загрузить prototype.js, если jquery.min.js не имеет уже был загружен. Если, однако, вы не получите никаких ошибок, тогда два скрипта могут быть загружены в любом порядке, который вы пожелаете. Предполагая, что у вас нет зависимостей загрузки между вашими внешними скриптами, код @ lonut великолепен. Если у вас есть зависимости загрузки - это становится очень сложно, и вы должны прочитать главу 4 в даже более быстрых веб-сайтах.
Во-вторых, одна проблема с кодом @ lonut заключается в том, что некоторые версии Opera будут вызывать loadCallback дважды (один раз из обработчика onload и второй раз из обработчика onreadystatechange). Просто добавьте флаг, чтобы убедиться, что loadCallback вызывается только один раз.
В-третьих, большинство браузеров сегодня открывают более двух соединений на имя хоста. См. Сводка по параллельным соединениям .