Afin de JavaScript <script> tag exécutions n'est pas garantie dans les principaux navigateurs?
Est-il vrai qu'il n'y a pas de garanties sur les principaux navigateurs que les balises de script s'exécute toujours à la fois séquentiellement ET dans leur ordre de déclaration? à savoir, si je suppose que le code suivant ne sera pas toujours le rendement x == 'ab' en alerte?
<head>
<script type="text/javascript">
//tag A
var x = x || ''; x += 'a';
</script>
<script type="text/javascript">
//tag B
var x = x || ''; x += 'b';
</script>
</head>
<body>
<script type="text/javascript">
alert('x='+x);
<script>
</body>
... et il est possible que x va plutôt être l'un des suivants:
- 'ba' - si l'étiquette B s'exécute avant Un
- 'a' ou 'b' - race condition où A et B s'exécutent en parallèle (Mais semble comme cette fil clairement dit que les navigateurs seulement allouer un seul thread de JS)
- Je suis familier avec ce qui est un problème lié js src fichiers, mais pas pour les blocs de script tel que défini dans la question. par exemple <script src="...."></script><script>code qui repose sur précédemment lié fichier</script> échouera 9 fois sur dix (cache fichier js étant de 1 à 10)
- Les navigateurs devraient très certainement être l'exécution de ces scripts à la fois séquentiellement et en ordre. Cette expérience a été le contraire?
- Ce n'est pas un problème lié JS fichiers, sauf s'ils utilisent
async
oudefer
attributs, ou eux-mêmes écrire/ajouter d'autres scripts. - Faut lire: html5rocks.com/en/tutorials/speed/script-loading
- J'ai aussi eu un cas décrit par @JonathanFingland ("
<script src="...."></script><script>code that relies on previously linked file</script>
") - la src a été chargement de jQuery, le bloc de script suivant comptais sur lui - mais trouvé$
être indéfini. Ajout d'unsetTimeout(..., 0)
'autour' du bloc de script code pour donner jQuery de temps à charger travaillé. Donc, il se passe quelque chose ici que je ne m'attends pas.
Vous devez vous connecter pour publier un commentaire.
L'ordre d'exécution de ces non-ajouté dynamiquement
script
, les étiquettes devraient être purementsequentially
dans chaque navigateur:Extrait de ce lien:
Cependant, les choses pourraient changer dès que vous êtes:
defer
attribut.document.write
scripts, reportez-vous à document.écrire le script d'exécution de la commande par kangax.<script>
recherchez dans les différents profonde élément de bod, est leorder
unDepth-first order
ouBreadth-first order
?