Если вы не загружаете скрипты динамически или не помечаете их как defer
или async
, тогда скрипты загружаются в порядке, встречающемся на странице. Неважно, является ли это внешним скриптом или встроенным скриптом - они выполняются в порядке, в котором они встречаются на странице. Встроенные сценарии, которые приходят после внешних сценариев, сохраняются до тех пор, пока все внешние сценарии, которые были до них, не загружены и запущены.
Асинхронные сценарии (независимо от того, как они указаны как асинхронные) загружаются и запускаются в непредсказуемом порядке. Браузер загружает их параллельно, и он может свободно запускать их в любом порядке.
Нет никакого предсказуемого порядка среди множества асинхронных вещей. Если требуется предсказуемый порядок, его необходимо кодировать, регистрируя уведомления о загрузке из асинхронных сценариев и вручную упорядочивая вызовы javascript при загрузке соответствующих объектов.
Когда тег сценария вставляется динамически, поведение порядка выполнения будет зависеть от браузера. Вы можете увидеть, как Firefox ведет себя в этой справочной статье . Короче говоря, более новые версии Firefox по умолчанию динамически добавляют тег сценария для асинхронизации, если тег сценария не был установлен иначе.
Тег скрипта с async
может быть запущен сразу после загрузки. Фактически, браузер может приостановить синтаксический анализатор от всего, что он делал, и запустить этот скрипт. Таким образом, он действительно может работать практически в любое время. Если сценарий был кэширован, он может запуститься практически сразу. Если для загрузки скрипта требуется некоторое время, он может запуститься после того, как парсер завершит работу. С async
нужно помнить, что он может работать в любое время, и это время не предсказуемо.
Тег сценария с defer
ожидает завершения работы всего синтаксического анализатора, а затем запускает все сценарии, отмеченные defer
, в том порядке, в котором они встречались. Это позволяет пометить несколько сценариев, которые зависят друг от друга, как defer
. Все они будут отложены до тех пор, пока анализатор документов не будет завершен, но они будут выполняться в том порядке, в котором они были найдены, сохраняя свои зависимости. Я думаю о defer
, как если бы сценарии были помещены в очередь, которая будет обработана после того, как синтаксический анализатор завершит работу. Технически браузер может загружать сценарии в фоновом режиме в любое время, но он не будет выполнять или блокировать синтаксический анализатор до тех пор, пока синтаксический анализатор не завершит синтаксический анализ страницы и синтаксический анализ и запуск любых встроенных сценариев, которые не отмечены defer
или async
.
Вот цитата из этой статьи:
скрипты, вставленные скриптами, выполняются асинхронно в IE и WebKit, но
синхронно в опере и до 4.0 Firefox.
Соответствующая часть спецификации HTML5 (для новых совместимых браузеров) - здесь . Там много написано об асинхронном поведении. Очевидно, что эта спецификация не относится к более старым браузерам (или браузерам с плохим подтверждением), поведение которых вам, вероятно, придется проверить, чтобы определить.
Цитата из спецификации HTML5:
Тогда первый из следующих вариантов, описывающих ситуацию
необходимо соблюдать:
Если элемент имеет атрибут src и элемент имеет отложенный
атрибут, и элемент был помечен как «вставленный парсер», и
элемент не имеет асинхронного атрибута
Элемент должен быть добавлен
до конца списка скриптов, которые будут выполняться, когда документ
завершил анализ, связанный с документом синтаксического анализатора, который
создал элемент.
Задача, которую источник сетевой задачи помещает в очередь задач один раз
алгоритм извлечения завершен должен установить элемент "готов к
быть выполненным парсером ». Парсер будет обрабатывать выполнение скрипта.
Если элемент имеет атрибут src и элемент помечен
как "вставленный парсером", и элемент не имеет асинхронного атрибута
Элементом является ожидающий сценарий синтаксического анализа документасинтаксический анализатор, который создал элемент.(Одновременно может быть только один такой сценарий для каждого документа.)
Задача, которую источник сетевых задач помещает в очередь задач после завершения алгоритма выборки, должна устанавливать элемент "готов к выполнению синтаксического анализа".флаг.Синтаксический анализатор будет обрабатывать выполнение сценария.
Если элемент не имеет атрибута src, и элемент был помечен как «вставленный синтаксический анализатор», а также документ HTML-анализатор или синтаксический анализатор XMLу созданного элемента script есть таблица стилей, которая блокирует сценарии Элемент является ожидающим сценарием блокировки синтаксического анализа в документе синтаксического анализатора, создавшего элемент.(Одновременно может быть только один такой скрипт для каждого документа.)
Установите флаг элемента "готов к выполнению парсером".Парсер будет обрабатывать выполнение скрипта.
Если элемент имеет атрибут src, не имеет атрибута async и не имеет установленного флага force-async Элемент должендобавьте в конец списка сценариев, которые будут выполняться по порядку при первой возможности, связанной с элементом Document элемента script во время запуска алгоритма подготовки сценария.
Задача, которая является источником сетевой задачиместа в очереди задач после завершения алгоритма выборки должны выполнить следующие шаги:
Если элемент не является первым элементом в списке сценариев, которые будут выполняться для того, чтобы как можно скореекоторый был добавлен выше, затем пометить элемент как готовый, но прервать эти шаги еще не выполняя сценарий.
Выполнение: Выполнить блок сценария, соответствующий первому элементу сценария в этом списке сценариев, который будетвыполнить по порядку как можно скорее.
Удалить первый элемент изm этот список сценариев, которые будут выполняться по порядку как можно скорее.
Если этот список сценариев, которые будут выполняться по порядку как можно скорее, все еще не пуст и первая запись уже помечена как готовая,затем вернитесь к шагу, помеченному как выполнение.
Если элемент имеет атрибут src Элемент должен быть добавлен к набору сценариев, которые будут выполняться как можно быстрее документа Document ofЭлемент сценария во время запуска алгоритма подготовки сценария.
Задача, которую источник сетевых задач помещает в очередь задач после завершения алгоритма выборки, должна выполнить блок сценария и затем удалить элемент из наборасценарии, которые будут выполняться как можно скорее.
В противном случае Пользовательский агент должен немедленно выполнить блок сценария, даже если другие сценарии уже выполняются.