2012-06-10 17 views
14

Non ho mai incontrato questo problema e non so perché. L'unica spiegazione è un problema di ambito.javascript definisce l'ambito tramite tag di script?

Nella stessa pagina, ho 2 sezioni di JS:

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

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

Questo mostrerà un errore: go non è definito

dove

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

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

è lavorando (ovviamente).

Il tag <script> crea un ambito di JS? aiuto?

+7

utilizzando tag di script è necessario prima definire la funzione e quindi chiamarla. – undefined

risposta

20

Questo non è un problema di ambito. Se si definisce una funzione (nell'ambito globale) in un elemento di script, è possibile utilizzarla in un altro.

Tuttavia, gli elementi di script vengono analizzati ed eseguiti mentre vengono rilevati.

Il sollevamento non funziona tra gli elementi di script. Una funzione definita in un successivo elemento di script non sarà disponibile durante l'esecuzione iniziale di un elemento di script precedente.

È necessario scambiare l'ordine degli elementi di script o ritardare la chiamata di funzione fino a quando non viene eseguito lo script che lo definisce (ad esempio collegandolo a un gestore di eventi onload).

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

o

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

il tuo primo codice non funziona ... (è come il mio esempio) intendevi scrivere quel codice? –

+1

Il tuo primo esempio è ancora nel modo sbagliato :) – floorish

+0

@floorish - Whoops. Grazie per la cattura! – Quentin

7

Il parser HTML si ferma per eseguire lo script prima di trasferirsi a successivi elementi. Quindi il successivo elemento di script non viene eseguito fino a quando non viene eseguito il primo.

Questo è paragonabile:

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

L'altra causa di questo come un errore apparente è se il primo blocco di script ha un errore di sintassi ed è respinta nella sua interezza, ma il secondo blocco gira su e manca il suo codice amico.

Problemi correlati