2013-05-24 13 views
7

Tarayıcıların her zaman dize ile yukarıdan aşağıya dizeden JavaScript kodu çalıştırdığını düşündüm (bu davranışı bir komut dosyası dilinden beklersiniz).JavaScript tam olarak nasıl yorumluyor?

// mükemmel

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

çalışır ancak bir değişken olarak işlev bildirmek eğer başarısız: Ama açıkça burada böyle değil 'Yakalanmayan ReferenceError: Test tanımlanmadı':

<script> 
    test(); 
    var test = function() { alert('test'); } 
</script> 

Yani javascript motoru bazen kodu yukarıdan aşağıya doğru yürütmez. Sonunda ilan edilmiş olsalar bile fonksiyonları önceden yükleyebilir. Tam olarak nasıl çalışır ve neden?

+0

Fonksiyonun() {} yalnızca kapsamın en üstüne taşınan özel bir durum olduğuna inanıyorum. Yine de yanlış olabilirim. –

+4

Tam olarak * a [AST] (http://en.wikipedia.org/wiki/Abstract_syntax_tree) gibi bir şeye dönüştürülmeden önce ayrıştırılır. Bu nedenle, kaynakta daha aşağı çizgiler için "Sözdizimi Hataları" nu görebilirsiniz. – Matt

+0

Buradaki en iyi cevaba bir göz atın: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper

cevap

9

Bu bir işlev ve değişken kaldırma örneğidir: işlev ve değişken bildirimleri geçerli kapsamın en üstüne taşınır.

Sizin örnekler içten bu dönüştürülür:

Durum 1:

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

Vaka 2: çıkarabiliriz Bundan

<script> 
    var test; 
    test(); 
    test = function() { alert('test'); } 
</script> 

, ikinci durumda değişken test yılında yürütmeye çalıştığınızda tanımsızdır.

İlgili konular