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?
Wierzę, że funkcja() {} jest tylko specjalnym przypadkiem, który zostaje przeniesiony na początek zakresu. Mogę się mylić. –
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
Zobacz najlepszą odpowiedź tutaj: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper