Skip to content

Latest commit

 

History

History
634 lines (438 loc) · 37.7 KB

File metadata and controls

634 lines (438 loc) · 37.7 KB

语法:

 Statement :    **    **    **    **    **    **    **    **    **    **    **    **    **    **    **

语义:

一个 ** 可以是 ** 的一部分,这个 ** 自身也可以是 ** 的一部分,以 此类推。当描述个别语句时引入标签的这种方式统称为 “当前标签组”。一个 ** 介绍了一个标签到一个 标签组,此外没有其他语义。一个 ** 或 ** 的标签组最初包含单个 empty 元素。任何其他语句的标签组最初是空的。

语法:

 Block :    { opt }**

 StatementList :    **     

语义:

产生式 ** : { } 按照下面的过程执行 :

  1. 返回 (normal, empty, empty)。

产生式 ** : { ** } 按照下面的过程执行 :

  1. 返回解释执行 ** 的结果。

产生式 ** : ** 按照下面的过程执行 :

  1. s 为解释执行 ** 的结果。
  2. 如果有一个异常被抛出,返回 (throw, V, empty),这里的 V 是异常。( 仿佛没有抛出异常一样继续运行。)
  3. 返回 s

产生式 ** : * * 按照下面的过程执行 :

  1. sl 为解释执行 ** 的结果。
  2. 如果 sl 是个非常规完结,返回 sl
  3. s 为解释执行 ** 的结果。
  4. 如果有一个异常被抛出,返回 (throw, V, empty),这里的 V 是异常。 ( 仿佛没有抛出异常一样继续运行。)
  5. 如果 s.valueempty ,令 V = sl.value, 否则令 V = s.value
  6. 返回 (s.type, V, s.target)。

变量语句

语法:

   VariableStatement :        var  ;**

   VariableDeclarationList :        **         , 

   VariableDeclarationListNoIn :        **         , 

   VariableDeclaration :        Identifier **

   VariableDeclarationNoIn :        Identifier **

   Initialiser :        = AssignmentExpression

   InitialiserNoIn :        = AssignmentExpressionNoIn

一个变量语句声明依 10.5 中定义创建的变量。当创建变量时初始化为 undefined。当 ** 被执行时变量关联的 ** 会被分配 AssignmentExpression 的值,而不是在变量创建时。

语义:

产生式 ** : var ** ; 按照下面的过程执行 :

  1. 解释执行 **。
  2. 返回 (normal, empty, empty)。

产生式 ** : ** 按照下面的过程执行 :

  1. 解释执行 **。

产生式 ** : ** , ** 按照下面的过程执行 :

  1. 解释执行 **。
  2. 解释执行 **。

产生式 ** : Identifier 按照下面的过程执行 :

  1. 返回一个包含跟 Identifier 完全相同的字符序列的字符串值。

产生式 ** : Identifier ** 按照下面的过程执行 :

  1. lhs 为解释执行 Identifier 的结果,如 11.1.2 所述。
  2. rhs 为解释执行 ** 的结果。
  3. valueGetValue(rhs)。
  4. 调用 PutValue(lhs, value)。
  5. 返回一个包含跟 Identifier 完全相同的字符序列的字符串值。

如果 ** 嵌套在 with 语句里并且 ** 里的标识符与 with 语句的对象式环境记录项关联的绑定对象的一个属性名相同,则第 4 步将给这个属性分配值,而不是为 IdentifierVariableEnvironment 绑定分配值。

产生式 ** : = AssignmentExpression 按照下面的过程执行 :

  1. 返回解释执行 AssignmentExpression 的结果。

产生式 **, **, ** 解释执行的方式与产生式 **, 相同,除了他们包含的 **, **, **, AssignmentExpressionNoIn 会分别替代 **, **, **, AssignmentExpression 来解释执行。

严格模式的限制

如果一个 ** 或 ** 出现在严格模式代码里并且其 Identifier"eval""arguments",那么这是个 SyntaxError

空语句

语法 :

 EmptyStatement :    ;

语义:

产生式 ** : ; 按照下面的过程执行 :

  1. 返回 (normal, empty, empty)。

表达式语句

语法:

 ExpressionStatement :    [lookahead ? {{function}] Expression ;

语义:

产生式 ** : [lookahead ? {{, function}] Expression ; 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. 返回 (normal, GetValue(exprRef), empty)。

if 语句

语法:

 IfStatement :    if ( Expression )  else     if ( Expression ) **

每个 else 选择与它相关联的 if 是不确定的,应与此 else 最近的并且原本没有与其对应的 else 的可能的 if 对应。

语义:

产生式 ** : if ( Expression ) ** else ** 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果 .

  2. 如果 ToBoolean(GetValue(exprRef)) 为 true ,则

    1. 返回解释执行第一个 ** 的结果。
  3. 否则,

    1. 返回解释执行第二个 ** 的结果。

产生式 ** : if ( Expression ) ** 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. 如果 ToBoolean(GetValue (exprRef)) 为 false 则返回 (normal, empty, empty).
  3. 返回解释执行 ** 的结果。

迭代语句

语法:

 IterationStatement :    do  while ( Expression ) ;     while ( Expression )     for ( ExpressionNoIn ; Expression ; Expression ) **    for ( var  ; Expression ; Expression )     for ( LeftHandSideExpression in Expression ) **    for ( var  in Expression ) 

do-while 语句

产生式 do ** while ( Expression ) ; 按照下面的过程执行 :

  1. V = empty

  2. iteratingtrue

  3. 只要 iteratingtrue,就重复

    1. stmt 为解释执行 ** 的结果。

    2. 如果 stmt.value 不是 empty,令 V = stmt.value

    3. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组,则

      1. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。
      2. 如果 stmt 是个非常规完结,返回 stmt
    4. exprRef 为解释执行 Expression 的结果。

    5. 如果 ToBoolean(GetValue(exprRef)) 是 false,设定 iteratingfalse

  4. 返回 (normal, V, empty)。

while 语句

产生式 ** : while ( Expression ) ** 按照下面的过程执行 :

  1. V = empty
  2. 重复
    1. exprRef 为解释执行 Expression 的结果。
    2. 如果 ToBoolean(GetValue(exprRef)) 是 false,返回 (normal, V, empty)。
    3. stmt 为解释执行 ** 的结果。
    4. 如果 stmt.value 不是 empty,令 V = stmt.value
    5. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则
      1. 如果 stmt.typebreak 并且 stmt.target当前标签组内,则

        1. 返回 (normal, V, empty)。
      2. 如果 stmt 是一个非常规完结,返回 stmt

for 语句

产生式 ** : for ( ExpressionNoInopt ; Expressionopt ; Expressionopt ) ** 按照下面的过程执行 :

  1. 如果 ExpressionNoIn 存在,则

    1. exprRef 为解释执行 ExpressionNoIn 的结果。
    2. 调用 GetValue(exprRef)。(不会用到此值。)
  2. V = empty

  3. 重复

    1. 如果第一个 Expression 存在,则

      1. testExprRef 为解释执行第一个 Expression 的结果。
      2. 如果 ToBoolean(GetValue(testExprRef)) 是 false,返回 (normal, V, empty)。
    2. stmt 为解释执行 ** 的结果。

    3. 如果 stmt.value 不是 empty,令 V = stmt.value

    4. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。

    5. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则

      1. 如果 stmt 是个非常规完结,返回 stmt
    6. 如果第二个 Expression 存在,则

      1. incExprRef 为解释执行第二个 Expression 的结果。
      2. 调用 GetValue(incExprRef)。(不会用到此值。)

产生式 ** : for ( var ** ; Expressionopt ; Expressionopt ) ** 按照下面的过程执行 :

  1. 解释执行 **。
  2. V = empty
  3. 重复
    1. 如果第一个 Expression 存在,则

      1. testExprRef 为解释执行第一个 Expression 的结果 .
      2. 如果 ToBoolean(GetValue(testExprRef)) 是 false,则返回 (normal, V, empty)。
    2. stmt 为解释执行 ** 的结果。

    3. 如果 stmt.value 不是 empty,令 V = stmt.value

    4. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。

    5. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则

      1. 如果 stmt 是个非常规完结,返回 stmt
    6. 如果第二个 Expression 存在,则

      1. incExprRef 为解释执行第二个 Expression 的结果。
      2. 调用 GetValue(incExprRef)。(不会用到此值。)

for-in 语句

产生式 ** : for ( ''' ''' LeftHandSideExpression in Expression ) ** 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. experValueGetValue(exprRef)。
  3. 如果 experValuenullundefined,返回 (normal, empty, empty)。
  4. objToObject(experValue)。
  5. V = empty
  6. 重复
    1. Pobj 的下一个 [[Enumerable]] 特性为 true 的属性的名。如果不存在这样的属性,返回 (normal, V, empty)。
    2. lhsRef 为解释执行 LeftHandSideExpression 的结果(它可能解释执行多次)。
    3. 调用 PutValue(lhsRef, P)。
    4. stmt 为解释执行 ** 的结果。
    5. 如果 stmt.value 不是 empty,令 V = stmt.value
    6. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。
    7. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则
      1. 如果 stmt非常规完结,返回 stmt

产生式 ** : for ( var ** in Expression ) ** 按照下面的过程执行 :

  1. varName 为解释执行 ** 的结果。
  2. exprRef 为解释执行 Expression 的结果。
  3. experValueGetValue(exprRef)。
  4. 如果 experValuenullundefined,返回 (normal, empty, empty)。
  5. objToObject(experValue)。
  6. V = empty
  7. 重复
    1. Pobj 的下一个 [[Enumerable]] 特性为 true 的属性的名。如果不存在这样的属性,返回 (normal, V, empty)。
    2. varRef 为解释执行 varName 的结果,仿佛它是个标示符引用(11.1.2)。它可能解释执行多次。
    3. 调用 PutValue(varRef, P)。
    4. stmt 为解释执行 ** 的结果。
    5. 如果 stmt.value 不是 empty,令 V = stmt.value
    6. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。
    7. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则
      1. 如果 stmt非常规完结,返回 stmt

枚举的属性(第一个算法中的 第6.1步、第二个算法中的 第7.1步)的机制和顺序并没有指定。在枚举过程中枚举的对象属性可能被删除。如果在枚举过程中,删除了还没有被访问到的属性,那么它将不会被访问到。如果在枚举过程中添加新属性到列举的对象,新增加的属性也无法保证被当前执行中的枚举访问到。在任何枚举中对同一个属性名称的访问不得超过一次。

从对象中枚举属性时也包括对象的原型链。但如果一个原型中的属性是“被遮住的”(原型链中靠前的对象有同样的属性名)就不会枚举。当一个原型对象的属性被原型链中靠前的对象属性遮住时就不考虑它的[[Enumerable]]特性

continue 语句

语法:

 ContinueStatement :    continue ;    continue [no LineTerminator hereIdentifier ;

语义:

如果以下任意一个为真,那么程序被认为是语法错误的:

  • 程序包含一个不带可选的 Identifiercontinue 语句,没有直接或间接(不跨越函数边界)的嵌套在 ** 里。
  • 程序包含一个有可选的 Identifiercontinue 语句,这个 Identifier 没有出现在 ** 中闭合标签组里(不跨越函数边界)。

一个没有 Identifier 的 ** 按照下面的过程执行 :

  1. 返回 (continue, empty, empty)。

一个有可选的 Identifier 的 ** 按照下面的过程执行 :

  1. 返回 (continue, empty, Identifier)。

break 语句

语法:

 BreakStatement :    break ;    break [no LineTerminator hereIdentifier ;

语义:

如果以下任意一个为真,那么程序被认为是语法错误的:

  • 程序包含一个不带可选的 Identifierbreak 语句,没有直接或间接(不跨越函数边界)的嵌套在 ** 或 ** 里。
  • 程序包含一个有可选的 Identifierbreak 语句,这个 Identifier 没有出现在 ** 中闭合标签组里(不跨越函数边界)。

一个没有 Identifier 的 ** 按照下面的过程执行 :

  1. 返回 (break, empty, empty)。

一个有可选的 Identifier 的 ** 按照下面的过程执行 :

  1. 返回 (break, empty, Identifier)。

return 语句

语法:

 ReturnStatement :    return ;    return [no LineTerminator hereExpression ;

语义:

在一个 ECMAScript 程序中包含的 return 语句没有在 FunctionBody 里面,那么就是语法错误的。一个 return 语句导致函数停止执行,并返回一个值给调用者。如果省略 Expression,返回值是 undefined。否则,返回值是 Expression 的值。

产生式 ** : return [no LineTerminator here] Expressionopt ; 按照下面的过程执行 :

  1. 如果 Expression 不存在,返回 (return, undefined, empty)。
  2. exprRef 为解释执行 Expression 的结果。
  3. 返回 (return, GetValue(exprRef), empty)。

with 语句

语法:

 WithStatement :    with ( Expression ) **

with 语句为计算对象给当前执行上下文的词法环境添加一个对象环境记录项。然后,用这个增强的词法环境执行一个语句。最后,恢复到原来的词法环境

语义 :

产生式 ** : with ( Expression ) ** 按照下面的过程执行 :

  1. val 为解释执行 Expression 的结果。
  2. objToObject(GetValue(val))。
  3. oldEnv 为运行中的执行上下文的词法环境组件
  4. newEnv 为以 objoldEnv 为参数调用 NewObjectEnvironment 的结果。
  5. 设定 newEnvprovideThis 标志为 true
  6. 设定运行中的执行上下文的词法环境组件为 newEnv
  7. C 为解释执行 ** 的结果,但如果解释执行是由异常抛出,则令 C 为 (throw, V, empty),这里的 V 是异常。(现在继续执行,仿佛没有抛出异常。)
  8. 设定运行中的执行上下文的词法环境组件为 oldEnv
  9. 返回 C

严格模式的限制

严格模式代码中不能包含 **。出现 ** 的上下文被当作一个 SyntaxError

switch 语句

语法:

 SwitchStatement :    switch ( Expression ) **

 CaseBlock :    {  }     {    }

 CaseClauses :    **     

 CaseClause :    case Expression : **

 DefaultClause :    default : **

语义:

产生式 ** : switch ( Expression ) ** 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. R 为以 GetValue(exprRef) 作为参数解释执行 ** 的结果。
  3. 如果 R.typebreak 并且 R.target当前标签组内,返回 (normal, R.value, empty)。
  4. 返回 R

产生式 ** : { **opt } 以一个给定输入参数 input, 按照下面的过程执行 :

  1. V = empty

  2. A 为以源代码中顺序排列的 ** 列表。

  3. searchingtrue

  4. 只要 searchingtrue,就重复

    1. CA 里的下一个 **。 如果没有 ** 了,返回 (normal, V, empty)。
    2. clauseSelector 为解释执行 C 的结果。
    3. 如果 inputclauseSelector=== 操作符定义的相等,则
      1. 设定 searchingfalse
      2. 如果 C 有一个 **, 则
        1. R 为解释执行 C 的 ** 的结果。
        2. 如果 R 是个非常规完结,则返回 R
        3. V = R.value
  5. 重复

    1. CA 里的下一个 **。 如果没有 ** 了,返回 (normal, V, empty)。
    2. 如果 C 有一个 **,则
      1. R 为解释执行 C 的 ** 的结果。
      2. 如果 R.value 不是 empty,则令 V = R.value
      3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。

产生式 ** : { **opt ** **opt } 以一个给定输入 参数 input,按照下面的过程执行 :

  1. V = empty

  2. A 为第一个 ** 中以源代码中顺序排列的 ** 列表。

  3. B 为第二个 ** 中以源代码中顺序排列的 ** 列表。

  4. foundfalse

  5. 重复,使 CA 中的依次每个 **。

    1. 如果 foundfalse,则

      1. clauseSelector 为解释执行 C 的结果 .
      2. 如果 inputclauseSelector=== 操作符定义的相等,则设定 foundtrue
    2. 如果 foundtrue,则

      1. 如果 C 有一个 **,则
        1. R 为解释执行 C 的 ** 的结果。
        2. 如果 R.value 不是 empty,则令 V = R.value
        3. R 是个非常规完结,则返回 (R.type, V, R.target)。
  6. foundInBfalse

  7. 如果 foundfalse,则

    1. 只要 foundInBfalse 并且所有 B 中的元素都没有被处理,就重复
      1. CB 里的下一个 **。
      2. clauseSelector 为解释执行 C 的结果。
      3. 如果 inputclauseSelector=== 操作符定义的相等,则
        1. 设定 foundInBtrue
        2. 如果 C 有一个 **,则
          1. R 为解释执行 C 的 ** 的结果。
          2. 如果 R.value 不是 empty,则令 V = R.value
          3. R 是个非常规完结,则返回 (R.type, V, R.target)。
  8. 如果 foundInBfalse 并且 ** 有个 **,则

    1. R 为解释执行 ** 的 ** 的结果。
    2. 如果 R.value 不是 empty,则令 V = R.value
    3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。
  9. 重复(注 : 如果已执行步骤 7.a.i, 此循环不从 B 的开头开始。)

    1. CB 的下一个 **。如果没有 ** 了,返回 (normal, V, empty)。
    2. 如果 C 有个 **,则
      1. R 为解释执行 C 的 ** 的结果。
      2. 如果 R.value 不是 empty,则令 V = R.value
      3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。

产生式 ** : case Expression : **opt 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. 返回 GetValue(exprRef)。

标签语句

语法:

 LabelledStatement :    Identifier : **

语义:

一个 ** 可以由一个标签作为前缀。标签语句仅与标签化的 breakcontinue 语句一起使用。ECMAScript 没有 goto 语句。

如果一个 ECMAScript 程序包含有相同 Identifier 作为标签的 ** 闭合的 **,那么认为它是是语法错误的。这不适用于直接或间接嵌套在标签语句里面的 FunctionDeclaration 的函数体里出现标签的情况。

产生式 Identifier : ** 的解释执行方式是,先添加 Identifier 到 ** 的标签组,再解释执行 **。如果 ** 自身有一个非空标签组,这些标签还是会添加到解释执行前的 ** 的标签组里。如果 ** 的解释执行结果是 (break, V, L),这里的 L 等于 Identifier,则产生式的结果是 (normal, V, empty)。

在解释执行 ** 之前,认为包含的 ** 拥有一个空标签组,除非它是 ** 或 **,这种情况下认为它拥有一个包含单个元素 empty 的标签组。

throw 语句

语法:

 ThrowStatement :    throw [no LineTerminator hereExpression ;

语义:

产生式 ** : throw [no LineTerminator here] Expression ; 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. 返回 (throw, GetValue(exprRef), empty)。

try 语句

语法:

 TryStatement :    try      try      try   **

 Catch :    catch ( Identifier ) **

 Finally :    finally **

try 语句包裹一个可以出现特殊状况,如果运行时错误或 throw 语句的代码块。catch 子句提供了异常处理代码。如果 catch 子句捕获到一个异常,这个异常会绑定到它的 Identifier 上。

语义:

产生式 ** : try ** ** 按照下面的过程执行 :

  1. B 为解释执行 ** 的结果。
  2. 如果 B.type 不是 throw,返回 B
  3. 返回一参数 B 解释执行 ** 的结果。

产生式 ** : try ** ** 按照下面的过程执行 :

  1. B 为解释执行 ** 的结果。
  2. F 为解释执行 ** 的结果。
  3. 如果 F.typenormal,返回 B
  4. 返回 F

产生式 ** : try ** ** ** 按照下面的过程执行 :

  1. B 为解释执行 ** 的结果。

  2. 如果 B.typethrow,则

    1. C 为以参数 B 解释执行 ** 的结果。
  3. 否则,B.type 不是 throw

    1. CB
  4. F 为解释执行 ** 的结果。

  5. 如果 F.typenormal,返回 C

  6. 返回 F

产生式 ** : catch '''( ''' Identifier ) ** 按照下面的过程执行 :

  1. C 为传给这个产生式的参数。
  2. oldEnv 为运行中执行上下文的词法环境组件
  3. catchEnv 为以 oldEnv 为参数调用 NewDeclarativeEnvironment 的结果。
  4. Identifier 字符串值为参数调用 catchEnvCreateMutableBinding 具体方法。
  5. IdentifierCfalse 为参数调用 catchEnvSetMutableBinding 具体方法。注:这种情况下最后一个参数无关紧要。
  6. 设定运行中执行上下文的词法环境组件为 catchEnv
  7. B 为解释执行 ** 的结果。
  8. 设定运行中执行上下文的词法环境组件为 oldEnv
  9. 返回 B

产生式 ** : finally ** 按照下面的过程执行 :

  1. 返回解释执行 ** 的结果。

严格模式的限制

如果一个有 ** 的 ** 出现在 严格模式代码里,并且 ** 产生式的 Identifier 是 "eval" 或 "arguments",那么这是个 SyntaxError

debugger 语句

语法:

 DebuggerStatement :    debugger ;

语义:

解释执行 ** 产生式可允许让一个实现在调试器下运行时设置断点。如果调试器不存在或是非激活状态,这个语句没有可观测效果。

产生式 ** : debugger ; 按照下面的过程执行 :

  1. 如果一个实现定义了可用的调试工具并且是开启的,则

    1. 执行实现定义的调试动作。
    2. result 为实现定义的完结值
  2. 否则

    1. result 为 (normal, empty, empty)。
  3. 返回 result