2011-07-10 9 views
25

Supongamos que tengo:Pregunta sobre múltiples listas ('s)

<script src="script1.js"></script> 
<script src="script2.js"></script> 

Ambos de estos scripts tienen ready() interior. ¿El código en script2.js ready() siempre se ejecutará después del primero?

Respuesta

29

Sí.

En primer lugar, el código en script2.js se ejecutará después de script1.js, como se trata más adelante en el documento (y el defer attribute no está establecido).

Además, the implementation [source] de la función de ready es:

ready: function(fn) { 
    // Attach the listeners 
    jQuery.bindReady(); 

    // Add the callback 
    readyList.done(fn); 

    return this; 
}, 

donde readyListseems to be [source] un deferred object [docs]. Eso significa que las devoluciones de llamada se ejecutan en el orden en que se agregaron a ese objeto.

+1

Buen trabajo Felix. Solo estaba viendo esa parte del código descomprimido tratando de descubrir cómo explicarlo ... –

+0

Gracias por la gran respuesta – babonk

2

Se dispararán las listas de documentos múltiples para que estén definidas.

0

.ready() funciones se llaman en la primera base registrada conseguir el primer procesado

+0

Me gustaría ver alguna atribución de fuente para eso ... según tengo entendido, se hace con un bucle for..in, lo que significa que usa el iterador sobre la colección, que no se puede garantizar el uso de la orden. – jcolebrand

14

jQuery usa su propio objeto Deferred para esto. El código apropiado de jQuery prueba que se ejecuta en orden:

Cuando se llama a .ready, se añade la función para la readyList:

readyList.done(fn); 

cuando el DOM está listo, se ejecuta esta función:

readyList.resolveWith(document, [ jQuery ]); 

La función resolveWith contiene el código que ejecuta las funciones añadidas como las devoluciones de llamada:

while(callbacks[ 0 ]) { 
    callbacks.shift().apply(context, args); 
} 

Como puede ver, las funciones de devolución de llamada son shift ed (aparecieron desde el comienzo de la matriz de devolución de llamada (es decir, readyList)), por lo que la primera se ejecuta antes que la segunda.

+0

Buena explicación. :) –

+0

Gracias por la información, votaciones ascendentes – babonk