ES5/语句

From HTML5 Chinese Interest Group Wiki
< ES5(Redirected from ES5/statements)
Jump to: navigation, search



语法:

 Statement :
   Block
   VariableStatement
   EmptyStatement
   ExpressionStatement
   IfStatement
   IterationStatement
   ContinueStatement
   BreakStatement
   ReturnStatement
   WithStatement
   LabelledStatement
   SwitchStatement
   ThrowStatement
   TryStatement
   DebuggerStatement


语义:

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

注: 已知几个广泛使用的 ECMAScript 实现支持 FunctionDeclaration 当作语句使用。然而,在实现之间这种 FunctionDeclaration 应用的语义也有严重且不兼容的差异。由于这些不兼容的差异,将 FunctionDeclaration 当作 Statement 使用的结果是代码在实现之间的可移植性不可靠。建议 ECMAScript 实现禁止这样运用 FunctionDeclaration,或遇到这样的运用是发出一个警告。ECMAScript 的未来版本可能定义替代的兼容方案以在 Statement 上下文中声明函数。


V8.png



语法:

 Block :
   { StatementListopt }
 StatementList :
   Statement
   StatementList Statement


语义:

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

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

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

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

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

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

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

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

变量语句 V8.png



语法:

   VariableStatement :
       var VariableDeclarationList ;
   VariableDeclarationList :
       VariableDeclaration
       VariableDeclarationList , VariableDeclaration
   VariableDeclarationListNoIn :
       VariableDeclarationNoIn
       VariableDeclarationListNoIn , VariableDeclarationNoIn
   VariableDeclaration :
       Identifier Initialiseropt
   VariableDeclarationNoIn :
       Identifier InitialiserNoInopt
   Initialiser :
       = AssignmentExpression
   InitialiserNoIn :
       = AssignmentExpressionNoIn

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


语义:

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

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

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

  1. 解释执行 VariableDeclaration

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

  1. 解释执行 VariableDeclarationList
  2. 解释执行 VariableDeclaration

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

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

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

  1. lhs 为解释执行 Identifier 的结果,如 11.1.2 所述。
  2. rhs 为解释执行 Initialiser 的结果。
  3. valueGetValue(rhs)。
  4. 调用 PutValue(lhs, value)。
  5. 返回一个包含跟 Identifier 完全相同的字符序列的字符串值。
注: VariableDeclaration 的字符串值用在 for-in 语句 (12.6.4) 的解释执行。

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


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

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

产生式 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn 解释执行的方式与产生式 VariableDeclarationList, VariableDeclarationInitialiser 相同,除了他们包含的 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn 会分别替代 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression 来解释执行。

严格模式的限制

如果一个 VariableDeclarationVariableDeclarationNoIn 出现在严格模式代码里并且其 Identifier"eval""arguments",那么这是个 SyntaxErrorV8.png

空语句 V8.png

语法 :

 EmptyStatement :
   ;


语义:

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

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

表达式语句 V8.png



语法:

 ExpressionStatement :
   [lookahead ∉ {{, function}] Expression ;
注: 一个 ExpressionStatement 不能用一个开大括号开始,因为这可能会使它和 Block 混淆。此外,ExpressionStatement 不能用 function 关键字开始,因为这可能会使它和 FunctionDeclaration 混淆。

语义:

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

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

if 语句 V8.png



语法:

 IfStatement :
   if ( Expression ) Statement else Statement
   if ( Expression ) Statement

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


语义:

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

  1. exprRef 为解释执行 Expression 的结果 .
  2. 如果 ToBoolean(GetValue(exprRef)) 为 true ,则
    1. 返回解释执行第一个 Statement 的结果。
  3. 否则,
    1. 返回解释执行第二个 Statement 的结果。


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

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

迭代语句



语法:

 IterationStatement :
   do Statement while ( Expression ) ; 
   while ( Expression ) Statement
   for ( ExpressionNoInopt ; Expressionopt ; Expressionopt ) Statement
   for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement
   for ( LeftHandSideExpression in Expression ) Statement
   for ( var VariableDeclarationNoIn in Expression ) Statement

do-while 语句 V8.png

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

  1. V = empty
  2. iteratingtrue
  3. 只要 iteratingtrue,就重复
    1. stmt 为解释执行 Statement 的结果。
    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 语句 V8.png

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

  1. V = empty
  2. 重复
    1. exprRef 为解释执行 Expression 的结果。
    2. 如果 ToBoolean(GetValue(exprRef)) 是 false,返回 (normal, V, empty)。
    3. stmt 为解释执行 Statement 的结果。
    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 语句 V8.png

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

  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 为解释执行 Statement 的结果。
    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)。(不会用到此值。)

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

  1. 解释执行 VariableDeclarationListNoIn
  2. V = empty
  3. 重复
    1. 如果第一个 Expression 存在,则
      1. testExprRef 为解释执行第一个 Expression 的结果 .
      2. 如果 ToBoolean(GetValue(testExprRef)) 是 false,则返回 (normal, V, empty)。
    2. stmt 为解释执行 Statement 的结果。
    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 语句 V8.png

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

  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 为解释执行 Statement 的结果。
    5. 如果 stmt.value 不是 empty,令 V = stmt.value
    6. 如果 stmt.typebreak 并且 stmt.target当前标签组内,返回 (normal, V, empty)。
    7. 如果 stmt.type 不是 continue || stmt.target 不在当前标签组内,则
      1. 如果 stmt非常规完结,返回 stmt

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

  1. varName 为解释执行 VariableDeclarationNoIn 的结果。
  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 为解释执行 Statement 的结果。
    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步)的机制和顺序并没有指定。在枚举过程中枚举的对象属性可能被删除。如果在枚举过程中,删除了还没有被访问到的属性,那么它将不会被访问到。如果在枚举过程中添加新属性到列举的对象,新增加的属性也无法保证被当前执行中的枚举访问到。在任何枚举中对同一个属性名称的访问不得超过一次。Note.png

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

注: 见 11.13.1 的注。

continue 语句 V8.png



语法:

 ContinueStatement :
   continue ;
   continue [no LineTerminator here] Identifier ;

语义:

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

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

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

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

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

break 语句 V8.png



语法:

 BreakStatement :
   break ;
   break [no LineTerminator here] Identifier ;

语义:

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

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

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

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

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

return 语句 V8.png



语法:

 ReturnStatement :
   return ;
   return [no LineTerminator here] Expression ;

语义:

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

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

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

with 语句 V8.png



语法:

 WithStatement :
   with ( Expression ) Statement

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

语义 :

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

  1. val 为解释执行 Expression 的结果。
  2. objToObject(GetValue(val))。
  3. oldEnv 为运行中的执行上下文的词法环境组件
  4. newEnv 为以 objoldEnv 为参数调用 NewObjectEnvironment 的结果。
  5. 设定 newEnvprovideThis 标志为 true
  6. 设定运行中的执行上下文的词法环境组件newEnv
  7. C 为解释执行 Statement 的结果,但如果解释执行是由异常抛出,则令 C 为 (throw, V, empty),这里的 V 是异常。(现在继续执行,仿佛没有抛出异常。)
  8. 设定运行中的执行上下文的词法环境组件oldEnv
  9. 返回 C
注: 无论控制是从嵌入的 Statement 怎样离开的,不论是正常离开还是以非常规完结或异常,词法环境组件总是恢复到它之前的状态。

严格模式的限制

严格模式代码中不能包含 WithStatement。出现 WithStatement 的上下文被当作一个 SyntaxErrorV8.png

switch 语句 V8.png



语法:

 SwitchStatement :
   switch ( Expression ) CaseBlock
 CaseBlock :
   { CaseClausesopt } 
   { CaseClausesopt DefaultClause CaseClausesopt }
 CaseClauses :
   CaseClause
   CaseClauses CaseClause
 CaseClause :
   case Expression : StatementListopt
 DefaultClause :
   default : StatementListopt

语义:

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

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

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

  1. V = empty
  2. A 为以源代码中顺序排列的 CaseClause 列表。
  3. searchingtrue
  4. 只要 searchingtrue,就重复
    1. CA 里的下一个 CaseClause。 如果没有 CaseClause 了,返回 (normal, V, empty)。
    2. clauseSelector 为解释执行 C 的结果。
    3. 如果 inputclauseSelector=== 操作符定义的相等,则
      1. 设定 searchingfalse
      2. 如果 C 有一个 StatementList, 则
        1. R 为解释执行 CStatementList 的结果。
        2. 如果 R 是个非常规完结,则返回 R
        3. V = R.value
  5. 重复
    1. CA 里的下一个 CaseClause。 如果没有 CaseClause 了,返回 (normal, V, empty)。
    2. 如果 C 有一个 StatementList,则
      1. R 为解释执行 CStatementList 的结果。
      2. 如果 R.value 不是 empty,则令 V = R.value
      3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。

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

  1. V = empty
  2. A 为第一个 CaseClauses 中以源代码中顺序排列的 CaseClause 列表。
  3. B 为第二个 CaseClauses 中以源代码中顺序排列的 CaseClause 列表。
  4. foundfalse
  5. 重复,使 CA 中的依次每个 CaseClause
    1. 如果 foundfalse,则
      1. clauseSelector 为解释执行 C 的结果 .
      2. 如果 inputclauseSelector=== 操作符定义的相等,则设定 foundtrue
    2. 如果 foundtrue,则
      1. 如果 C 有一个 StatementList,则
        1. R 为解释执行 CStatementList 的结果。
        2. 如果 R.value 不是 empty,则令 V = R.value
        3. R 是个非常规完结,则返回 (R.type, V, R.target)。
  6. foundInBfalse
  7. 如果 foundfalse,则
    1. 只要 foundInBfalse 并且所有 B 中的元素都没有被处理,就重复
      1. CB 里的下一个 CaseClause
      2. clauseSelector 为解释执行 C 的结果。
      3. 如果 inputclauseSelector=== 操作符定义的相等,则
        1. 设定 foundInBtrue
        2. 如果 C 有一个 StatementList,则
          1. R 为解释执行 CStatementList 的结果。
          2. 如果 R.value 不是 empty,则令 V = R.value
          3. R 是个非常规完结,则返回 (R.type, V, R.target)。
  8. 如果 foundInBfalse 并且 DefaultClause 有个 StatementList,则
    1. R 为解释执行 DefaultClauseStatementList 的结果。
    2. 如果 R.value 不是 empty,则令 V = R.value
    3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。
  9. 重复(注 : 如果已执行步骤 7.a.i, 此循环不从 B 的开头开始。)
    1. CB 的下一个 CaseClause。如果没有 CaseClause 了,返回 (normal, V, empty)。
    2. 如果 C 有个 StatementList,则
      1. R 为解释执行 CStatementList 的结果。
      2. 如果 R.value 不是 empty,则令 V = R.value
      3. 如果 R 是个非常规完结,则返回 (R.type, V, R.target)。

产生式 CaseClause : case Expression : StatementListopt 按照下面的过程执行 :

  1. exprRef 为解释执行 Expression 的结果。
  2. 返回 GetValue(exprRef)。
注: 解释执行 CaseClause 不会运行相关的 StatementList。它只简单的解释执行 Expression 并返回值,这里的 CaseBlock 算法用于确定 StatementList 开始执行。

标签语句 V8.png



语法:

 LabelledStatement :
   Identifier : Statement

语义:

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

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

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

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

throw 语句 V8.png



语法:

 ThrowStatement :
   throw [no LineTerminator here] Expression ;


语义:

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

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

try 语句 V8.png



语法:

 TryStatement :
   try Block Catch
   try Block Finally
   try Block Catch Finally
 Catch :
   catch ( Identifier ) Block
 Finally :
   finally Block

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

语义:

产生式 TryStatement : try Block Catch 按照下面的过程执行 :

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

产生式 TryStatement : try Block Finally 按照下面的过程执行 : Note.png Note.png

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

产生式 TryStatement : try Block Catch Finally 按照下面的过程执行 :

  1. B 为解释执行 Block 的结果。
  2. 如果 B.typethrow,则
    1. C 为以参数 B 解释执行 Catch 的结果。
  3. 否则,B.type 不是 throw
    1. CB
  4. F 为解释执行 Finally 的结果。
  5. 如果 F.typenormal,返回 C
  6. 返回 F

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

  1. C 为传给这个产生式的参数。
  2. oldEnv 为运行中执行上下文的词法环境组件
  3. catchEnv 为以 oldEnv 为参数调用 NewDeclarativeEnvironment 的结果。 Note.png
  4. Identifier 字符串值为参数调用 catchEnvCreateMutableBinding 具体方法。
  5. IdentifierCfalse 为参数调用 catchEnvSetMutableBinding 具体方法。注:这种情况下最后一个参数无关紧要。
  6. 设定运行中执行上下文的词法环境组件catchEnv
  7. B 为解释执行 Block 的结果。
  8. 设定运行中执行上下文的词法环境组件oldEnv
  9. 返回 B
注: 不管控制是怎样退出 Block 的,词法环境组件总是会恢复到其之前的状态。

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

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

严格模式的限制 V8.png

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

debugger 语句 V8.png



语法:

 DebuggerStatement :
   debugger ;

语义:

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

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

  1. 如果一个实现定义了可用的调试工具并且是开启的,则
    1. 执行实现定义的调试动作。
    2. result 为实现定义的完结值。
  2. 否则
    1. result 为 (normal, empty, empty)。
  3. 返回 result