2010-07-20 14 views
1

S'il y a 2 ou 3 ou 20 déclarations en utilisant

de jQuery
$(function() { ... }) 

pour ajouter des fonctions à exécuter lorsque le DOM est prêt, seront toutes les fonctions de fonctionner en parallèle ou exécuter dans l'ordre?

Répondre

5

document.ready se comporte comme un événement normal à cet égard, ils se produisent dans une séquence et dans l'ordre où ils ont été liés. Vous pouvez voir the relevant jQuery core source here:

C'est ce qui se passe quand vous faites $(function):

ready: function(fn) { 
    jQuery.bindReady(); 
    if (jQuery.isReady) { 
     fn.call(document, jQuery); 
    } else if (readyList) { 
     readyList.push(fn); 
    } 
    return this; 
} 

Et cela se produit plus tard, quand l'événement se déclenche "prêt":

if (readyList) { 
    var fn, i = 0; 
    while ((fn = readyList[ i++ ])) { 
     fn.call(document, jQuery); 
    } 
    readyList = null; 
} 

Si est le document déjà prêt, la fonction s'exécute immédiatement, c'est la partie if dans le premier bloc de code ci-dessus.

+0

basé sur le code ci-dessus, il semble qu'une fois que le document est prêt, vous ne pouvez plus ajouter à la fin de la file d'attente - tous les nouveaux gestionnaires prêts s'exécuteront immédiatement. cela signifie que ce n'est pas tout à fait l'ordre de liaison, puisque les liens post-prêts seront exécutés immédiatement. –

+1

@Sean - ils sont toujours dans l'ordre appelé :) –

3

ils seront exécutés en séquence. vous pouvez mettre à Firebug pour des points d'arrêt voir ce comportement

+0

Je ne pense pas que l'utilisation de points d'arrêt est un test concluant. Vous pouvez mettre des points d'arrêt pour plusieurs threads dans Eclipse en utilisant Java par exemple, et le débogueur s'arrêtera à chaque point d'arrêt. Le facteur distinctif est que le thread en cours d'exécution est répertorié. Si ce n'était pas le cas, vous ne pourrez pas dire si le code est en cours d'exécution. – Anurag

3

Ils fonctionneront en séquence. Le code Javascript ne fonctionne pas en parallèle.

+0

Dans ce cas, c'est vrai, mais comme une déclaration générale, ce n'est pas * entièrement * vrai, [bobince] (http://stackoverflow.com/users/18936/bobince) a fait un grand article sur les exceptions ici: http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded –

+1

@Nick: Cela ressemble plus à l'exécution est interrompue par des événements dans certains cas, plutôt que de courir en parallèle. – Guffa

+0

Le code Javascript ne fonctionne pas en parallèle? Que se passe-t-il si vous avez 2 'setInterval()' un toutes les 0.1 seconde, et un autre toutes les 0.11 secondes, alors 2 fonctions ne fonctionneront-elles pas en parallèle à un moment donné? (comme 2 threads) –