IdentifierName can be devided into ReservedWord and Identifier.
A keyword is a token that matches IdentifierName, but also has a syntactic use.
Many keywords are reserved words, but some are reserved only in certain contexts. contextual keywords(await and yield) belong to ReservedWord but sometimes can be used as identifiers.
Followings belong to Identifier but not intepreted as so under certain syntactic productions:
let, static
implements, interface, package, private, protected, public; but in future, they will become reserved.
A proxy object is an exotic object whose essential internal methods are partially implemented using ECMAScript code.
Every proxy object has an internal slot called [[ProxyHandler]]. The value of [[ProxyHandler]] is an object, called the
proxy's handler object, or null. Every proxy object also has an internal slot called
[[ProxyTarget]] whose value is either an object or the null value. This object is called the proxy's target object.
When a handler method is called to provide the implementation of a proxy object internal method, the handler
method is passed the proxy's target object as a parameter. Invoking an internal method on the proxy results in the invocation
of the corresponding internal method on the proxy's target object if the handler object does not have a method
corresponding to the internal trap.
[[GetPrototypeOf]] ( )
Let trap be ? GetMethod(handler, "getPrototypeOf").
If not IsExtensible(target) or trap is undefined, Return ? target.[[GetPrototypeOf]]().
return call trap on target to get target's prototype
[[SetPrototypeOf]] ( V )
if not IsExtensible(target), return true
Let trap be ? GetMethod(handler, "setPrototypeOf").
If trap is undefined, Return ? target.[[SetPrototypeOf]](V).
return call trap on target&V to set target's prototype
Most ECMAScript functions make an arguments object available to their code. Depending upon the characteristics of
the function definition, its arguments object is either an ordinary object or an arguments exotic object.
An arguments exotic object is an exotic object whose array index properties map to the formal parameters bindings.
Arguments exotic objects have a [[ParameterMap]] internal slot. Ordinary arguments objects also have a [[ParameterMap]] internal slot whose value is always undefined.
[[GetOwnProperty]] ( P )
Let args be the arguments object.
Let desc be OrdinaryGetOwnProperty(args, P).
If desc is undefined, return desc.
Let map be args.[[ParameterMap]].
Let isMapped be HasOwnProperty(map, P).
If isMapped, set desc.[[Value]] to Get(map, P)
Return desc.
[[DefineOwnProperty]] ( P, Desc )
Let newArgDesc be Desc.
If isMapped and Desc.[[Value]] is not present and Desc.[[Writable]] is false,
Set newArgDesc to a copy of Desc except newArgDesc.[[Value]] as Get(map, P)
if not OrdinaryDefineOwnProperty(args, P, newArgDesc), return false.
If isMapped is false, return true
If IsAccessorDescriptor(Desc), call map.[[Delete]](P) and return true
If Desc.[[Value]] is present, Set(map, P, Desc.[[Value]], false).
If Desc.[[Writable]] is false, Call map.[[Delete]](P)
NewGlobalEnvironment ( G, thisValue ) returns a new global env who's outer lexical environment is null and its global Environment Record created as globalRec:
.[[ObjectRecord]]: a new object Environment Record who's binding object is G
.[[DeclarativeRecord]]: a new declarative Environment Record; [[VarNames]]: a new empty List.
.[[GlobalThisValue]]: thisValue (zxxu: thisValue and G means different stuff? according to SetRealmGlobalObject and InitializeHostDefinedRealm, they can be the same but also can be different)