为什么"抛出"限制生产自动分号插入?

Wil*_*kel 6 javascript grammar

JavaScript的自动分号插入算法的一部分是所谓的"限制性制作".这些是句法形式,禁止在某一点发生换行符.引用ECMAScript 2015规范:

如果短语"[ 此处没有LineTerminator ]"出现在句法语法生成的右侧,则表示生产是限制生产:如果LineTerminator出现在输入流中,则可能无法使用它.指示的位置.

ECMAScript 2015规范中有10个限制产品:

  • PostfixExpression [Yield] : LeftHandSideExpression [?Yield] [ 此处没有LineTerminator ]++
  • PostfixExpression [Yield] : LeftHandSideExpression [?Yield] [ 此处没有LineTerminator ]--
  • ContinueStatement [Yield] : continue [ 此处没有LineTerminator ] LabelIdentifier [?Yield] ;
  • BreakStatement [Yield] : break [ 此处没有LineTerminator ] LabelIdentifier [?Yield] ;
  • ReturnStatement [Yield] : return [ 此处没有LineTerminator ] 表达式 ;
  • ReturnStatement [Yield] : return [ 此处没有LineTerminator ] 表达式[In,?Yield] ;
  • ThrowStatement [Yield] : throw [ 此处没有LineTerminator ] 表达式[In,?Yield] ;
  • ArrowFunction [In,Yield] : ArrowParameters [?Yield] [ 此处没有LineTerminator ] => ConciseBody [?In]
  • YieldExpression [In] : yield [ 此处没有LineTerminator ] * AssignmentExpression [?In,Yield]
  • YieldExpression [In] : yield [ 此处没有LineTerminator ] AssignmentExpression [?In,Yield]

在这些作品中,我理解选择使大部分作品受到限制.限制PostfixExpression的生成以防止使用PrefixExpression解析歧义.ContinueStatement,BreakStatementReturnStatement具有受限制的产品,因为有相应的产品,其中breakcontinue不带标签,return不带表达式.我不能说我对箭头函数或屈服表达式了解得足以知道为什么它们受到限制,但我认为这是为了防止某种类似的解析模糊.

我不理解的制作是ThrowExpression.据我所知,没有涉及到使用无歧义解析throw使用时像有break,returncontinue:毕竟,throw;不是有效的JavaScript.我认为这可能是出于历史原因,但据我所知throw;,从未在任何JavaScript规范中被允许.

这样做的实际结果就像return你一样,你不能把表达式抛到下一行,例如这是错误的:

throw
new Error("some error");
Run Code Online (Sandbox Code Playgroud)

但是,与return此不同,这与将其new Error()放在同一行上没有不同的行为.这只是一个语法错误:Chrome将其报告为

未捕获的SyntaxError:抛出后非法换行

ThrowExpression的生产是否仅限于保持与类似结构的一致性?或者是否有一些我没有看到的歧义?

ric*_*ici 5

当它throw在 1998 年左右被添加到语言中时,出现了关于 throw 语句是否需要表达式的讨论。(另一种选择是throw不带表达式的 a 重新抛出当前异常对象,就像在某些其他语言中一样。)

我找不到这次讨论的任何记录,也找不到最终决议的任何记录——尽管我们知道该决议是什么——但在1998 年 2 月 19 日会议的TC39 会议记录中提到了这一点。我认为其意图是限制的目的是保留句法空间,以防有一天决定发生改变。