2013-05-24 14 views
7

Zawsze uważałem, że przeglądarki wykonują kod JavaScript od góry do dołu łańcucha za pomocą ciągu znaków (raczej oczekujesz takiego zachowania z języka skryptowego). Ale oczywiście nie jest to przypadek tutaj:Jak dokładnie interpretowany jest JavaScript?

// działa idealnie

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

ale gdybym funkcji zadeklarować jako zmienną nie powiedzie się z „Uncaught ReferenceError: test nie jest zdefiniowana”:

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

Tak więc silnik javascript czasami nie wykonuje kodu od góry do dołu. Może jakoś wstępnie załadować funkcje, nawet jeśli są one zadeklarowane na końcu. Jak dokładnie działa i dlaczego?

+0

Wierzę, że funkcja() {} jest tylko specjalnym przypadkiem, który zostaje przeniesiony na początek zakresu. Mogę się mylić. –

+4

Jest on całkowicie sparsowany, zanim zostanie wykonany w coś * jak * a [AST] (http://en.wikipedia.org/wiki/Abstract_syntax_tree). Właśnie dlatego możesz zobaczyć "Błędy składni" dla linii znajdujących się w dalszej części źródła. – Matt

+0

Zobacz najlepszą odpowiedź tutaj: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper

Odpowiedz

9

Jest to przykład funkcji i zmiennego podnoszenia: funkcja i deklaracje zmiennych są przenoszone na początek bieżącego zakresu.

Twoje przykłady są wewnętrznie konwertowane do tego:

Przypadek 1:

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

Przypadek 2:

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

Z tego można wywnioskować, że w drugim przypadku zmienna test jest niezdefiniowane, gdy próbujesz go wykonać.