12.1 标识符
语法
IdentifierReference[Yield]:
Identifier
[~Yield] yield
BindingIdentifier[Yield]:
Identifier
[~Yield] yield
LabelIdentifier[Yield]:
Identifier
[~Yield] yield
Identifier:
IdentifierName but not ReservedWord
12.1.1 静态语法:预检错误
- 在严格模式下,“arguments” 和 “eval”是Identifier会报错
- 在严格模式下, IdentifierReference,BindingIdentifier,LabelIdentifier如果是yield,会报错。
- 在严格模式下,"implements", "interface", "let", "package", "private", "protected", "public", "static", 或者 "yield" 作为IdentifierName会报错。这个时候 let 和 static 被当作保留关键字。
- 除了yield,任何保留字作为IdentifierName都会报错
注意:IdentifierName 的StringValue会正规化任何Unicode转义字符,所以IdentifierName中不能包含任何和保留字的Unicode转义字符序列相同的Unicode转义字符。
12.1.2 静态语法:BoundNames
BindingIdentifier: Identifier
- Return a new List containing the StringValue of Identifier
BindingIdentifier: yield
- Return a new List containing "yield".
12.1.3 静态语法:IsValidSimpleAssignmentTarget
IdentifierReference:Identifier
- If this IdentifierReference is contained in strict mode code and StringValue of Identifier is "eval" or "arguments", return false
- return true
IdentifierReference:yield
- return true
12.1.4 静态语法:StringValue
IdentifierReference:yield
BindingIdentifier:yield
LabelIdentifier:yield
- Return
"yield"
.
Identifier:IdentifierName but not ReservedWord
- Return the StringValue of IdentifierName.
12.1.5 运行时语法:BindingInitialization
以value和environment为参数
注意:environment的值为undefined时,意味着PutValue操作将是进行初始化赋值。这个情况是在var语句及在非严格模式函数中的形参 (详见9.2.12). 在这个情况下,词法绑定将会提升,并且会比执行其初始化操作更早。
BindingIdentifier:Identifier
Let name be StringValue of Identifier.
Return ? InitializeBoundName(name, value, environment).
BindingIdentifier:yield
Return ? InitializeBoundName("yield", value, environment).
12.1.5.1 运行时语法:InitializeBoundName(name,value,environment)
- Assert:Type(name) is String.
- If environment is not undefined , then
- Let env be the EnvironmentRecord component of environment.
- Perform env.InitializeBinding(name,value).
- Return NormalCompletion(undefined).
- Else,
- Let lhs be ResolveBinding(name).
- Return ?PutValue(lhs,value).
12.1.6 运行时语法:Evaluation
IdentifierReference:Identifier
Return ? ResolveBinding(StringValue of Identifier).
IdentifierReference:yield
Return ? ResolveBinding("yield").
注意1:IdentifierReference的执行结果永远是Reference类型值
注意2:在非严格模式代码中,yield关键字可以被用作Identifier。执行IdentifierReference产生式,绑定yield,就像yield是一个Identifier一样。早期错误的限制确保了这样的操作只会发生在非严格模式中。见13.3.1中处理yield绑定在创建上下文时。