Предположим, что у меня есть:
<script src="script1.js"></script>
<script src="script2.js"></script>
Оба этих сценария имеют ready()
внутри. Будет ли код в script2.js ready()
всегда выполняться после первого?
Предположим, что у меня есть:
<script src="script1.js"></script>
<script src="script2.js"></script>
Оба этих сценария имеют ready()
внутри. Будет ли код в script2.js ready()
всегда выполняться после первого?
Да.
Прежде всего, код в script2.js
будет выполнен после script1.js
, как это происходит позже в документе (и атрибут defer
не установлен).
Кроме того, реализация [source] функции ready
:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.done( fn );
return this;
},
где readyList
кажется [source] a отложенный объект [docs]. Это означает, что обратные вызовы выполняются в том порядке, в котором они были добавлены к этому объекту.
jQuery использует для этого свой собственный объект Deferred
. Соответствующий код jQuery доказывает, что он выполняется в следующем порядке:
Когда вы вызываете .ready
, функция добавляется к readyList
:
readyList.done( fn );
Когда DOM готов, эта функция выполняется:
readyList.resolveWith( document, [ jQuery ] );
Функция resolveWith
содержит этот код, который выполняет функции, добавленные как обратные вызовы:
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
Как вы можете видеть, функции обратного вызова shift
ed (выскользнули с начала массива обратного вызова (т.е. readyList
)), поэтому сначала выполняется выполнение перед вторым.
Несколько готовых документов будут запущены, чтобы они перестали работать.
.ready()
функции вызываются при первом зарегистрированном получении первой обработанной базы