2012-06-10 14 views
14

Bu sorunla hiçbir zaman karşılaşmadınız ve nedenini bilmiyorsunuz. Tek açıklama, bir kapsam sorunudur. Bu bir hata gösterecektirjavascript, kapsamı komut dosyası etiketleriyle tanımlar?

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

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

: Aynı sayfada

, ben JS 2 bölümden

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

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

olduğu go

tanımlanmamıştır çalışıyor (belli ki).

<script> etiketi bir JS kapsamı oluşturur mu? yardım?

+7

Komut dosyası etiketlerini kullanarak işlevi ilk önce tanımlamanız ve sonra da çağırmanız gerekir. – undefined

cevap

20

Bu bir kapsam sorunu değil. Bir betik öğesinde (global kapsamda) bir işlev tanımlarsanız, bunu başka bir öğede kullanabilirsiniz. Bununla birlikte, komut dosyası öğeleri, karşılaştıkları gibi ayrıştırılır ve yürütülür.

Kaldırma, kod öğeleri arasında çalışmaz. Daha sonraki bir betik öğesinde tanımlanan bir işlev, daha önceki bir betik öğesinin ilk çalışması sırasında kullanılamaz.

Ya komut dosyalarınızın sırasını değiştirmeli ya da tanımlayan komut dosyası çalıştırıldıktan sonra (örneğin, bir onload olay işleyicisine ekleyerek) işlev çağrısını geciktirmeniz gerekir.

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

veya

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

İlk kodunuz çalışmıyor ... (onun benim örneğim gibi) bu kodu yazmak mı demek istediniz? –

+1

İlk örneğiniz hala yanlış yoldur :) – floorish

+0

@floorish - Whoops. Yakalama için teşekkürler! – Quentin

7

html ayrıştırıcı sonraki unsurlara geçmeden önce senaryoyu yürütmek için durur. Böylece, bir sonraki komut öğesi öğesi , ilk gerçekleştirilinceye kadar yürütülmez.

Bu

karşılaştırılabilir:

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

ilk komut bloğu bir sözdizim hatası vardır ve bütünüyle reddedilmektedir, ama ikinci bir blok ve kaçırdığı çalıştırırsa belirgin bir hata olarak diğer bir nedenidir arkadaş kodu.

İlgili konular