Для буквального обозначения Number
все остальные ответы указывают вам правильное направление, 7.
является действительным DecimalLiteral
.
Грамматика говорит о том, что десятичные цифры после первой точки необязательны:
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
* Обратите внимание на дополнительный суффикс
Теперь для функции проблема в том, что она оценивается в контексте оператора .
Существует два допустимых грамматических способа создания функциональных объектов (третий способ создания функций - это использование Function
конструктора , но пока это не в тему).
FunctionDeclaration:
function name(/*[param] [, param] [..., param]*/) {
// statements
}
Выражение функции:
var foo = function /*nameopt*/(/*[param] [, param] [..., param]*/) {
// statements
};
Грамматика почти идентична, разница в том, где появляется ключевое слово function
.
A объявление функции происходит, когда ключевое слово function
найдено непосредственно в глобальном коде или в FunctionBody
функции.
A выражение функции происходит тогда, когда в контексте выражение найдено ключевое слово function
, как и в предыдущем примере, вторая функция является частью AssignmentExpression
.
Но у вас на самом деле две проблемы, во-первых, имя FunctionDeclaration
обязательно.
Во-вторых, когда вычисляется оператор FunctionDeclaration
, точка просто вызовет SyntaxError
, потому что точка не ожидается.
Заключение функции в скобки (формально называемое Оператор группировки ) делает функцию, которая будет оцениваться в контексте выражения , выражении функции .
Например, допустимо следующее:
0,function () {}.alert();
Вышеописанное работает, потому что оператор запятой вычисляет выражений .
Вам также следует знать, что FunctionDeclarations
оцениваются в «время разбора» (точнее, когда элемент управления входит в Контекст выполнения , с помощью Переменная Instantiation process) и идентификаторы (имена функций) доступны для всей текущей области, например:
foo(); // alerts "foo", function made available at 'parse time'
foo = function () { alert('bar') }; // override with a FunctionExpression
function foo () { alert('foo'); } // FunctionDeclaration
foo(); // alerts "bar", the overriden function
Рекомендуемая статья: