Ответ 1
Посмотрите на грамматику языка, не так ли? Раздел 12, Заявления:
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
...lots of other stuff...
Это очень причудливый способ сказать, что оператор может быть блоком, оператором переменной, пустым оператором, выражением выражения или множеством других вещей. Обратите внимание, что в первом варианте есть "Блок":
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement
Это опять же фантастический способ сказать, что блок - это {
, необязательно сопровождаемый кучей операторов, за которым следует }
.
И это то, что вы видите в своем примере: до того, как парсер JavaScript считает, что то, что у вас есть, может быть объектным литералом (который определен где-то под ExpressionStatement
, 4-е место - это "выражение" ), оно сначала думает что у вас есть "Блок".
Изменить: если вы хотите, вы можете увидеть его в исходном коде двигателя JavaScript:
- В V8, движке JavaScript Chrome, переходим к
Parser::ParseStatement
. первое, что он проверяет, является ли мы на{
, и если это так, анализирует как блок. - В программе SpiderMonkey, JavaScript JavaScript, мы переходим из
Parser::statement
, чтобы снова увидеть первая проверка, которая против{
и разбора его как блока.
Относительно вашего второго вопроса, который был подробно рассмотрен по этому вопросу. Подводя итог в предложении: Node.js рассматривает ваш ввод так, как если бы это было выражение (таким образом, он не может быть "Блоком" ), в то время как средства Firebug/Chrome dev рассматривают его как "Statement".