2012-06-10 5 views
14

Nunca se ha encontrado este problema y no sé por qué. La única explicación es un problema de alcance.javascript define el alcance por etiquetas de script?

En la misma página, tengo 2 secciones de JS:

... 
<script type="text/javascript"> 
    go(); 
    </script> 

    <script type="text/javascript"> 
    function go() 
    { alert(''); } 
    </script> 
... 

Esto mostrará un error: Go no se define

donde

... 
    <script type="text/javascript"> 
     go(); 

     function go() 
     { alert(''); } 
     </script> 
    ... 

es trabajando (obviamente).

¿La etiqueta <script> crea un ámbito de JS? ayuda?

+7

utilizando etiquetas de script, primero debe definir la función y luego llamarla. – undefined

Respuesta

20

Esto no es un problema de alcance. Si define una función (en el ámbito global) en un elemento de script, puede usarlo en otro.

Sin embargo, los elementos del script se analizan y se ejecutan a medida que se encuentran.

El levantamiento no funcionará en los elementos del guión. Una función definida en un elemento de script posterior no estará disponible durante la ejecución inicial de un elemento de script anterior.

Debe intercambiar el orden de los elementos del script o retrasar la llamada a la función hasta que se haya ejecutado el script que la define (por ejemplo, adjuntándolo a un controlador de eventos onload).

<script> 
    function go() { 
     alert(''); 
    } 
</script> 
<script> 
    go(); 
</script> 

o

<script> 
    window.addEventListener("load", function() { 
     go(); 
    }, false); 
</script> 
<script> 
    function go() { 
     alert(''); 
    } 
</script> 
+0

su primer código no funciona ... (es como mi ejemplo) ¿Quiso escribir ese código? –

+1

Su primer ejemplo sigue siendo el camino equivocado :) – floorish

+0

@floorish - Whoops. Gracias por la captura! – Quentin

7

El analizador HTML paradas para ejecutar la secuencia de comandos antes de pasar a la siguiente elementos. Entonces, el siguiente elemento de script no se ejecuta hasta que se ejecuta el primero.

Esto es comparable a:

<script> 
document.getElementById("hello") //null because the html parser hasn't met the div yet. 
</script> 
<div id="hello"></div> 
1

La otra causa de esto como un error aparente es si el primer bloque de script tiene un error de sintaxis y se rechaza en su totalidad, pero el segundo bloque se ejecuta en y se pierde su código de amigo

Cuestiones relacionadas