Ответ 1
{
в начале выражения сигнализирует "блок оператора" (см. ECMA-262-3, раздел 12.1), который содержит список заявления.
}
немедленно завершает блок оператора без каких-либо утверждений. Это здорово. Но теперь синтаксический анализатор ищет следующее утверждение:
==false
А? Это не утверждение; синтаксическая ошибка.
Что представляют собой блоки операторов? Ну, вы пишете блок утверждения каждый раз, когда вы говорите:
if (something) {
...
}
JavaScript определяет эти операторы управления потоком как:
if "(" <expression> ")" <statement> [else <statement>]
т. в одной форме заявления без брекетов. Затем он позволяет использовать блок-оператор в любом месте, где вы можете использовать один оператор, что означает, что вы можете иметь if-braces-many-statements. Но это также означает, что вы можете иметь блок-блок самостоятельно, без соответствующего оператора управления потоком.
Это не имеет практической цели! Возможно, у вас возникнет соблазн подумать, что он скрывает информацию, но нет:
var a= 1;
{
var a= 2;
}
alert(a);
... приводит к 2
, потому что блоки операторов сами по себе не создают новую область.
JavaScript определяет блоки управления потоками и операторы таким образом, потому что C (и другие языки, полученные из него). Эти языки не делали {}
двойным делом как выражение объекта Object, хотя они не имели двусмысленности, которая делает эту еще одну неудачную JS-ошибку.
Даже этот wannabe-literal:
{
a: 1
}
является допустимым блоком оператора, потому что ': используется для обозначения метки в инструкции. (и 1
- бесполезный оператор выражения, при этом точка с запятой опущена.) Ярлыки - это еще одна функция, унаследованная от C, которые редко используются в JavaScript. Они не совсем бессмысленны, как блоки, но они редко нужны и часто считаются со слабым вкусом.
(Литерал с двумя свойствами вызовет синтаксическую ошибку, поскольку литералы объектов используют разделители запятой, но помеченные операторы должны быть разделены точкой с запятой.)
Это не единственное место, где JavaScript-синтаксис может вас пошевелить, сделав какое-то другое утверждение того, что, по вашему мнению, является выражением.