The strict mode restriction and exceptions
implements
, interface
, let
, package
, private
,
protected
, public
, static
, and yield
are reserved words within strict mode code. (11.6.2).
A conforming implementation, when processing strict mode code, may not extend the syntax of NumericLiteral (11.8.3) to include LegacyOctalIntegerLiteral as described in B.1.1.
A conforming implementation, when processing strict mode code, may not extend the syntax of EscapeSequence to include LegacyOctalEscapeSequence as described in B.1.2.
Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global
object. When a simple assignment occurs within strict mode code, its LeftHandSide
must not evaluate to an unresolvable Reference. If it does a
ReferenceError exception is thrown (6.2.3.2). The LeftHandSide also may not be a
reference to a data property with the attribute value {[[Writable]]:false}, to an accessor property with the
attribute value {[[Set]]:undefined}, nor to a non-existent property of an object whose [[Extensible]] internal slot has the value false. In these cases a
TypeError
exception is thrown (12.14).
The identifier eval
or arguments
may not appear as the LeftHandSideExpression of an
Assignment operator (12.14) or of a PostfixExpression (12.4) or as the UnaryExpression operated upon by a Prefix Increment (12.5.7) or a Prefix Decrement (12.5.8) operator.
Arguments objects for strict mode functions define non-configurable accessor properties named "caller"
and
"callee"
which throw a TypeError exception on access (9.2.7).
Arguments objects for strict mode functions do not dynamically share their array indexed property values with the corresponding formal parameter bindings of their functions. (9.4.4).
For strict mode functions, if an arguments object is created the binding of the local identifier arguments
to the arguments object is immutable and hence may not be the target of an assignment expression. (9.2.12).
It is a SyntaxError if the IdentifierName eval
or the IdentifierName
arguments
occurs as a BindingIdentifier within strict
mode code (12.1.1).
Strict mode eval code cannot instantiate variables or functions in the variable environment of the caller to eval. Instead, a new variable environment is created and that environment is used for declaration binding instantiation for the eval code (18.2.1).
If this is evaluated within strict mode code, then the this value is
not coerced to an object. A this value of null or undefined is not converted to the global object and
primitive values are not converted to wrapper objects. The this value passed via a function call (including calls
made using Function.prototype.apply
and Function.prototype.call
) do not coerce the passed this value to an object (9.2.1.2, 19.2.3.1, 19.2.3.3).
When a delete
operator occurs within strict mode code, a
SyntaxError is thrown if its UnaryExpression is a direct reference to a variable, function argument, or
function name (12.5.4.1).
When a delete
operator occurs within strict mode code, a
TypeError is thrown if the property to be deleted has the attribute { [[Configurable]]:false } (12.5.4.2).
Strict mode code may not include a WithStatement. The occurrence of a WithStatement in such a context is a SyntaxError (13.11.1).
It is a SyntaxError if a TryStatement with a Catch occurs within strict mode code and the Identifier of the Catch production is
eval
or arguments
(13.15.1).
It is a SyntaxError if the same BindingIdentifier appears more than once in the FormalParameters of a strict mode function. An attempt to create such a function using a
Function
or Generator
constructor is a SyntaxError (14.1.2, 19.2.1.1.1).
An implementation may not extend, beyond that defined in this specification, the meanings within strict mode functions of
properties named caller
or arguments
of function instances. ECMAScript code may not create or
modify properties with these names on function objects that correspond to strict mode functions (16.1).