2010-07-12 15 views
26

¿Es verdad que no hay garantías en los principales navegadores de que las siguientes etiquetas de secuencia de comandos siempre se ejecutarán secuencialmente Y en orden de declaración? es decir, ¿debería suponer que el siguiente código no siempre arrojará x == 'ab' en alerta?El pedido de JavaScript <script> no se garantiza la ejecución de las etiquetas en los principales navegadores?

<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> 

... y es posible que en lugar de x será uno de los siguientes:

  1. 'ba' - si la etiqueta B se ejecuta antes de una
  2. 'a' o 'b' - condición de carrera, donde a y B se ejecutan en paralelo (Aunque parece que this hilo dice claramente que los navegadores sólo se asignan un solo hilo de JS)
+2

Estoy familiarizado con que esto es un problema para los archivos js src vinculados, pero no para los bloques de scripts como se define en la pregunta. p.ej. fallará 9 veces de cada diez (el archivo js en caché es 1 de cada 10) –

+2

Los navegadores definitivamente deberían ejecutar estos scripts secuencialmente y en orden. ¿Tu experiencia ha sido lo contrario? –

+4

@JonathanFingland: tampoco es un problema para los archivos JS vinculados, a menos que utilicen los atributos 'async' o' delafer', o que ellos mismos escriban/agreguen más scripts. – bobince

Respuesta

30

El orden de ejecución de éstas no añaden dinámicamente script etiquetas deben ser puramente sequentially en todos los navegadores:

de fragmentos de this link:

sentencias de JavaScript que aparecen entre <script> y </script> etiquetas son ejecutados por orden de aparición; cuando aparece más de un script en un archivo , los scripts se ejecutan en el orden en el que aparecen.

Sin embargo, las cosas podrían cambiar tan pronto como estás:

+3

Esto es válido incluso para scripts 'document.write' anidados, ver [orden de ejecución del script document.write] (http://kangax.github.com/jstests/document_write_script_execution_order_test/) por kangax. –

+0

Hoy he fallado tanto en esto. Mi sitio web estaba bien, hasta que puse la estática en un CDN y la orden de carga ya no estaba garantizada (de alguna manera mi servidor estático original se sirve en FIFO (primero en entrar primero en salir)).Sugerencia: no cargue múltiples archivos js dependientes agregando etiquetas de secuencia de comandos dinámicamente. Entonces simplemente concat los archivos más o menos. ¡Gracias chicos! – gabn88

+0

Especialmente, múltiples '

Cuestiones relacionadas