Ответ 1
Синтаксическая неоднозначность, к которой относится Крокфорд, заключается в том, что если открытая фигурная скобка не найдена в контексте выражения, она будет распознана как block, а не как начало литерала объекта.
Например:
{"foo": "bar"} // SyntaxError
Дает вам синтаксическую ошибку, потому что она будет интерпретироваться как блок с строковым литералом "foo" и неожиданным использованием токена :
.
С другой стороны, круглые скобки, формально называемые оператором группировки, могут только оценивать выражения, поэтому у нас не будет никакой синтаксической двусмысленности потому что блок можно ожидать только в контексте инструкции.
({"foo": "bar"})
Изменить: @el.pescado задает интересный вопрос:
Можете ли вы объяснить, почему eval ('{}') undefined?
ECMAScript описывает внутренний тип для объяснения поведения операторов, который называется Тип спецификации завершения.
Значения типа завершения - это тройки формы (type, value, target)
, где type
может быть normal
, break
, continue
, return
или throw
.
value
может быть любое значение языка или empty
, а target
любой идентификатор или empty
.
Пустой блок (производственный Block : {}
) явно возвращает следующее завершение:
Return (normal, empty, empty).
Функция eval
после выполнения кода и выхода из вновь созданного контекста выполнения проверяет завершение результата оцениваемого кода, и на шаге 7 мы видим, что undefined
явно возвращается, если тип завершения normal
, а значение завершения empty
:
...
7- Если result.type является нормальным, а его значение завершения пустым, верните значение undefined.
...