Подтвердить что ты не робот

Последствия нескольких тегов <script> в HTML

Я читал, что не рекомендуется создавать jQuery несколько раз в вашем HTML. Это имеет для меня смысл, но: В любом случае, Javascript однопоточно? И оставив jQuery позади, как браузер выполняет эти несколько тегов script? Параллельно или один за другим?

Спасибо, Филипп

4b9b3361

Ответ 1

Простой ответ:

В простом сценарии (теги являются частью исходного HTML-текста) браузер определенно выполняет их один за другим.

Подробное обсуждение с различными оговорками

JavaScript не обязательно однопоточный (это зависит от реализации вашего механизма JavaScript, например см. Веб-работники).

НО, индивидуальные теги <script> выполняются последовательно.

Для справки см. JavaScript: The Definitive Guide. Цитирование главы "12.3. Выполнение программ JavaScript":

Операторы JavaScript, которые появляются между и тегами, выполняются в порядке появления; когда в файле появляется более одного script, сценарии выполняются в том порядке, в котором они отображаются. Если script вызывает document.write(), любой текст, переданный этому методу, вставляется в документ сразу после закрывающего тега и анализируется парсером HTML после завершения работы script. Те же правила применяются к скриптам, включенным в отдельные файлы с атрибутом src.


Обратите внимание, что вышеизложенное относится только к "прямому" выполнению кода в тегах. На порядок может влиять:

  • setTimeout() calls (duh)

  • атрибут defer

  • Динамическое прикрепление тегов <script> - см. последний раздел этого ответа.


Как caveat, обратите внимание, что код JavaScript, загруженный извне через <script src="xxxx" />, все равно будет выполняться последовательно, НО, вполне возможно, что браузер будет ЗАГРУЗИТЬ параллельный код - зависит от реализации браузера (но по-прежнему планировать выполнение загруженных фрагментов кода в правильном порядке).

Это предостережение важно, если вы хотите иметь какой-то странный хак, тогда как URL-адрес источника JavaScript на самом деле является CGI script, который что-то делает, и вы пытаетесь зависеть от правильного порядка загрузки для логики в script.

Опять же, это не повлияет на порядок выполнения вашего браузера JS для этих script штук.


Однако гораздо важнее : если вы действительно добавляете теги <script> с внешними источниками динамически (например, через вызов appendChild()), согласно этот SO post, а также блог MSDN, пост был основан на, не IE браузеры НЕ гарантируют порядок выполнения! Это будет зависеть от того, какой код тега завершил загрузку первым!

Ответ 2

Чем меньше вызовов вы создаете, создавая объект jQuery, тем меньше накладных расходов у вас есть - но даже если вы разрабатываете старые браузеры, работающие на оборудовании второго поколения, опасайтесь микрооптимизации. Профилируйте свое приложение и исправьте части, которые на самом деле являются узкими местами.

В том, как браузеры обрабатывают несколько тегов script - он варьируется от браузера до браузера, от версии к версии, а иногда и от операционной системы до операционной системы. Все браузеры выполняют каждый тэг script в порядке документа:

<script src="scripts/some_script.js"></script> <!-- Executed 1st -->
<script src="scripts/some_other_script.js"></script> <!-- Executed 2nd -->
<script>
// Some JavaScript
</script> <!-- Executed 3rd -->
<script>
// Some More JavaScript
</script> <!-- Executed 4th -->

Однако другие типы поведения не определены и существуют вариации. Например, Opera (по крайней мере, в Windows XP для версии 10.6) запускала каждый тэг script в своем собственном контексте - поэтому локальные переменные в третьем блоке script были бы недоступны, если они упоминаются в 4-м script блок.

<script>
var i = 42;
</script>
<script>
alert(i);
// Alerts "undefined" in Opera, but 42 in Firefox.
</script>

Ответ 3

Браузер выполняет JavaScript последовательно (то же самое верно для jQuery, поскольку jQuery - это просто JavaScript).

Что касается наличия нескольких тегов script в HTML, нет причин, по которым это было бы проблемой. Как спросил Набаб, мне было бы интересно увидеть ваш источник для этого.

Ответ 4

Не обозревает ли браузер все javascript в любом "файле" во время обработки. Например, если у вас было несколько вызовов $(document).ready() в нескольких файлах, когда браузер предварительно обрабатывает страницу, он по существу конденсирует все на выполнение - и последовательно запускает его в том порядке, в котором он был "замечен".