2012-06-10 14 views
14

Nigdy nie spotkałem się z tym problemem i nie wiem dlaczego. Jedynym wyjaśnieniem jest problem z zasięgiem.javascript definiuje zasięg za pomocą znaczników skryptu?

W tej samej stronie, mam 2 odcinki JS:

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

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

Pokaże błąd: Go nie jest zdefiniowana

gdzie

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

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

jest działa (oczywiście).

Czy <script> tag tworzy zakres JS? pomoc?

+7

za pomocą znaczników skryptów należy najpierw zdefiniować funkcję, a następnie wywołać. – undefined

Odpowiedz

20

To nie jest problem z zasięgiem. Jeśli zdefiniujesz funkcję (w zasięgu globalnym) w jednym elemencie skryptu, możesz jej użyć w innym.

Jednak elementy skryptu są analizowane i wykonywane w momencie ich napotkania.

Podnoszenie nie działa między elementami skryptu. Funkcja zdefiniowana w późniejszym elemencie skryptu nie będzie dostępna podczas początkowego uruchomienia wcześniejszego elementu skryptu.

Musisz zamienić kolejność elementów skryptu lub opóźnić wywołanie funkcji, aż do momentu uruchomienia skryptu, który definiuje jego działanie (np. Poprzez dołączenie go do obsługi zdarzeń onload).

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

lub

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

twój pierwszy kod nie działa ... (to jak moja próbka) miałeś zamiar napisać ten kod? –

+1

Twój pierwszy przykład jest nadal złą drogą :) – floorish

+0

@floorish - Whoops. Dzięki za połów! – Quentin

7

parser HTML zatrzymuje wykonanie skryptu przed przejściem do kolejnych elementów. Tak więc następny element skryptu nie zostanie wykonany, dopóki nie zostanie wykonany pierwszy skrypt.

Jest to porównywalne do:

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

Inną przyczyną tego jako pozorną błędu jest, jeżeli pierwszy blok skryptu błąd składni i została odrzucona w całości, a drugi blok przebiega dalej i chybienia jego znajomy kod.

Powiązane problemy