В большинстве случаев реализация должна сообщать об ошибках в момент вычисления соответствующей языковой конструкции ECMAScript. Ранняя ошибка early error – это ошибка, которую реализация может обнаружить и о которой может сообщить до вычисления конструкции в Программе, содержащей эту ошибку. Реализация должна сообщать о ранних ошибках в Программе до первого вычисления этой Программы. Сообщения о ранних ошибках в eval-коде появляются в момент вызова eval, но до момента вычисления какой-либо конструкции внутри этого eval-кода. Все ошибки, не являющиеся ранними ошибками, представляют собой ошибки времени исполнения runtime errors.
eval
Реализация должна рассматривать все случаи следующих ошибок как раннюю ошибку:
Любая синтаксическая ошибка.
Попытка определить ObjectLiteral, который имеет несколько присваиваний свойств get с одинаковым именем или несколько присваиваний свойств set с одинаковым именем.
Попытка определить ObjectLiteral, который имеет одновременно и присваивание свойства данных и присваивание свойства get или set с одинаковым именем.
Ошибки в литералах регулярного выражения, которые не являются синтаксическими расширениями, зависящими от реализации.
Попытки в коде в строгом режиме определить ObjectLiteral, имеющий несколько присваиваний свойств данных с одним и тем же именем.
Появление WithStatement в коде в строгом режиме.
Появление значения идентификатора Identifier более одного раза в FormalParameterList для отдельного FunctionDeclaration или FunctionExpression в строгом режиме.
Некорректное использование return, break и continue.
return
break
continue
Попытки вызвать PutValue для значения, по которому можно заранее определить, что оно не является Reference (например, при выполнении инструкции присваивания 3=4).
3=4
Реализация не должна трактовать другие ошибки как ранние ошибки, даже если компилятор может доказать, что конструкция ни при каких обстоятельствам не может быть выполнена без ошибки. В таком случае реализация может выдать ранее предупреждение, но она не должна сообщать об ошибке до момента фактического выполнения соответствующей конструкции.
Реализация должна сообщать обо всех ошибках как указано, за исключением следующих моментов:
Реализация может расширить синтаксис программы и шаблон регулярного выражения или синтаксис флага. Для этого всем операциям, которым разрешено генерировать SyntaxError, (таким как вызов eval, использование литерала регулярного выражения, или использование конструктора Function или RegExp), разрешается демонстрировать поведение, зависящее от реализации, а не генерировать SyntaxError в случае, когда они встречают зависящее от реализации расширение синтаксиса программы или шаблона регулярного выражения или синтаксиса флагов.
Function
RegExp
Реализация может предоставлять дополнительные типы, значения, объекты, свойства и функции, кроме описанных в данной спецификации. В результате некоторые конструкции (например, поиск переменной в глобальной области видимости) могут демонстрировать зависящее от реализации поведение, а не генерировать ошибку (например, ReferenceError).
Реализация может определить поведение, отличное от генерирования ошибки RangeError для методов toFixed, toExponential и toPrecision, когда их аргументы fractionDigits или precision находятся вне заданного диапазона.
toFixed
toExponential
toPrecision