2016-09-24 1 views
3

Этот короткий фрагмент кода, очевидно, неисправен: не должно быть указаноинтерпретатор JavaScript игнорирует ошибку синтаксиса

if (5 > 2) { 
    console.log("5 > 2"); 
} else (5 < 2) { 
    console.log("5 < 2"); 
} 

Условие для else. Выполнение этого кода приведет к SyntaxError: Unexpected token {, как и ожидалось.


Проблема заключается в том, что после незначительных изменений (перенос левой фигурной скобки на новую строку), интерпретатор будет просто игнорировать ошибку синтаксиса.

Этот код:

if (5 > 2) { 
    console.log("5 > 2"); 
} else (5 < 2) 
{ 
    console.log("5 < 2"); 
} 

результаты в этой продукции (проверено в хроме и светлячок):

5 > 2 
5 < 2 

Как это возможно? Почему этот else не рассматривается как синтаксическая ошибка?

+0

это выглядит правильно. второй блок '{ console.log (" 5 <2 "); } 'не считается частью else на всех ... и' (5 <2) ', в то время как бессмысленный действителен - это похоже на' else {(5 <2)} ' –

ответ

3

Причиной различной интерпретации является первым из ECMAScript Rules of Automatic Semicolon Insertion:

  1. Когда, как программа анализируется слева направо, маркер (называемый токеном-нарушителем) встречается то есть не допускается любого производства грамматики, то точка с запятой автоматически вставляется перед токеном-нарушителем, если один или несколько из следующих условий:

    • токен-нарушитель отделен от предварительно по меньшей мере, один LineTerminator.
    • Оскорбительный токен - }.

В вашем случае, маркер-нарушителем является {. В первой версии вашего кода ни одно из условий маркерной точки, приведенное выше, не является истинным, поэтому точка с запятой не вставлена, и возникает синтаксическая ошибка.

Во втором примере вашего кода есть терминатор линии, как указано в первом условии.В этом случае точка с запятой автоматически вставляется так разобранный код действительно становится это:

if (5 > 2) { 
    console.log("5 > 2"); 
} else (5 < 2); 
{ 
    console.log("5 < 2"); 
} 

Теперь код действует в качестве открывающей скобки, который следует за точкой с запятой интерпретируются как начало блока кода, который не является частью выражение, которое следует за else.

Обратите внимание, что хотя этот код теперь анализирует, ясно, что выражение в части else не имеет никакого эффекта.

+0

Большое вам спасибо за такой быстрый и полный ответ :) Я был просто шокирован, когда код после автоматического благоустройства привел к разным результатам. –

+0

Добро пожаловать. «Автоматическая вставка запятой» действительно является одним из менее оцененных синтаксических правил JavaScript. – trincot

6

Разница заключается в том, что во втором случае возврат каретки делает второй блокированный блок автономным блоком, а не частью предложения else, где скобковая часть является предложением else. Второй случай эквивалентен:

if (5 > 2) { 
    console.log("5 > 2"); 
} else { 
    (5 < 2) 
} 

{ 
    console.log("5 < 2"); 
} 

который просто:

if (5 > 2) { 
    console.log("5 > 2"); 
} else { 
    false 
} 

console.log("5 < 2"); 
3

Это все потому, что Automatic Semicolon Insertion, когда вы переносите эту скобку на следующую строку, JS двигатель «переводит» код к этому:

if (5 > 2) { 
    console.log("5 > 2"); 
} else (5 < 2); 
{ 
    console.log("5 < 2"); 
} 

Это, очевидно, правильно, поскольку JS позволяет размещать автономные блоки.