12.1 标识符

语法

  1. IdentifierReference[Yield]:
  2. Identifier
  3. [~Yield] yield
  4. BindingIdentifier[Yield]:
  5. Identifier
  6. [~Yield] yield
  7. LabelIdentifier[Yield]:
  8. Identifier
  9. [~Yield] yield
  10. Identifier:
  11. IdentifierName but not ReservedWord

12.1.1 静态语法:预检错误

  • 在严格模式下,“arguments”“eval”是Identifier会报错
  • 在严格模式下, IdentifierReference,BindingIdentifier,LabelIdentifier如果是yield,会报错。
  • 在严格模式下,”implements”, “interface”, “let”, “package”, “private”, “protected”, “public”, “static”, 或者 “yield” 作为IdentifierName会报错。这个时候 letstatic 被当作保留关键字。
  • 除了yield,任何保留字作为IdentifierName都会报错

注意:IdentifierName 的StringValue会正规化任何Unicode转义字符,所以IdentifierName中不能包含任何和保留字的Unicode转义字符序列相同的Unicode转义字符。

12.1.2 静态语法:BoundNames

BindingIdentifier: Identifier

  1. Return a new List containing the StringValue of Identifier

BindingIdentifier: yield

  1. Return a new List containing “yield”.

12.1.3 静态语法:IsValidSimpleAssignmentTarget

IdentifierReference:Identifier

  1. If this IdentifierReference is contained in strict mode code and StringValue of Identifier is “eval” or “arguments”, return false
  2. return true

IdentifierReference:yield

  1. return true

12.1.4 静态语法:StringValue

IdentifierReference:yield

BindingIdentifier:yield

LabelIdentifier:yield

  1. Return "yield".

Identifier:IdentifierName but not ReservedWord

  1. Return the StringValue of IdentifierName.

12.1.5 运行时语法:BindingInitialization

以value和environment为参数

注意:environment的值为undefined时,意味着PutValue操作将是进行初始化赋值。这个情况是在var语句及在非严格模式函数中的形参 (详见9.2.12). 在这个情况下,词法绑定将会提升,并且会比执行其初始化操作更早。

  1. BindingIdentifier:Identifier
  2. Let name be StringValue of Identifier.
  3. Return ? InitializeBoundName(name, value, environment).
  4. BindingIdentifier:yield
  5. Return ? InitializeBoundName("yield", value, environment).

12.1.5.1 运行时语法:InitializeBoundName(name,value,environment)

  1. Assert:Type(name) is String.
  2. If environment is not undefined , then
    1. Let env be the EnvironmentRecord component of environment.
    2. Perform env.InitializeBinding(name,value).
    3. Return NormalCompletion(undefined).
  3. Else,
    1. Let lhs be ResolveBinding(name).
    2. Return ?PutValue(lhs,value).

12.1.6 运行时语法:Evaluation

  1. IdentifierReference:Identifier
  2. Return ? ResolveBinding(StringValue of Identifier).
  3. IdentifierReference:yield
  4. Return ? ResolveBinding("yield").

注意1:IdentifierReference的执行结果永远是Reference类型值

注意2:在非严格模式代码中,yield关键字可以被用作Identifier。执行IdentifierReference产生式,绑定yield,就像yield是一个Identifier一样。早期错误的限制确保了这样的操作只会发生在非严格模式中。见13.3.1中处理yield绑定在创建上下文时。