2013-05-24 3 views
7

Я всегда думал, что браузеры выполняют код JavaScript сверху вниз по строке (вы, похоже, ожидаете этого поведения со языка сценариев). Но ясно, что это не тот случай:Как точно интерпретируется JavaScript?

// отлично работает

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

но если я объявляю функции в качестве переменной он терпит неудачу с «неперехваченным ReferenceError: тест не определен»:

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

Поэтому механизм javascript иногда не выполняет код сверху вниз. Он может как-то предварительно загружать функции, даже если они объявлены в конце. Как это работает и почему?

+0

Я верю, что функция() {} - это особый случай, который перемещается в верхнюю часть области. Я мог ошибаться. –

+4

Он разбирается полностью, прежде чем он будет выполнен во что-то *, как * a [AST] (http://en.wikipedia.org/wiki/Abstract_syntax_tree). Вот почему вы видите «Синтаксические ошибки» для строк, расположенных дальше по источнику. – Matt

+0

Посмотрите на главный ответ здесь: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname – viper

ответ

9

Это пример функции и переменной подъема: функции и объявления переменных перемещаются в верхнюю часть текущей области.

Ваши примеры внутренне преобразуется следующим образом:

Случай 1:

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

Случай 2:

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

Из этого можно сделать вывод, что во втором случае переменная test не определено, когда вы пытаетесь его выполнить.

Смежные вопросы