Основы JavaScript. Подключение скриптов
В одном теге SCRIPT нельзя одновременно подключить внешний скрипт и указать код.
Вот так не cработает:
<script src="file.js">
alert(1); // так как указан src, то внутренняя часть тега игнорируется
</script>
Нужно выбрать: либо SCRIPT идёт с src, либо содержит код. Тег выше следует разбить на два:
один — с src, другой — с кодом, вот так:
<script src="file.js"></script>
<script>
alert( 1 );
</script>
Атрибут async
Поддерживается всеми браузерами, кроме IE9-. Скрипт выполняется полностью асинхронно. То есть, при обнаружении <script async src="..."> браузер не останавливает обработку страницы, а спокойно работает дальше. Когда скрипт будет загружен — он выполнится.
Атрибут defer
Поддерживается всеми браузерами. Скрипт выполняется асинхронно, не заставляет ждать страницу, но, в отличие от async, браузер гарантирует, что относительный порядок скриптов с defer будет сохранён.
То есть, в таком коде (с async) первым сработает тот скрипт, который раньше загрузится:
<script src="1.js" async></script>
<script src="2.js" async></script>
А в таком коде (с defer) первым сработает всегда 1.js, а скрипт 2.js, даже если загрузился раньше, будет его ждать.
<script src="1.js" defer></script>
<script src="2.js" defer></script>
Атрибут defer используют в тех случаях, когда второй скрипт 2.js зависит от первого 1.js
!!! Либо async либо defer
Одновременно указывать async и defer не имеет смысла, в этом случае браузер использует только async.
!!! Атрибуты async/defer — только для внешних скриптов
Атрибуты async/defer работают только в том случае, если назначены на внешние скрипты, т.е. имеющие src.
При попытке назначить их на обычные скрипты <script>...</script>, они будут проигнороированы.