If the phrase “[no LineTerminator here]” appears in the right-hand side of a production of the syntactic grammar,it indicates that the production is a restricted production: it may not be used if a LineTerminator occurs in the input stream at the indicated position.
ECMAScript 2015规范中有10个限制产品:
> PostfixExpression [Yield]:LeftHandSideExpression [?Yield] [此处没有LineTerminator]
> PostfixExpression [Yield]:LeftHandSideExpression [?Yield] [此处没有LineTerminator] –
> ContinueStatement [Yield]:继续[此处没有LineTerminator] LabelIdentifier [?Yield];
> BreakStatement [Yield]:break [此处没有LineTerminator] LabelIdentifier [?Yield];
> ReturnStatement [Yield]:返回[此处没有LineTerminator]表达式;
> ReturnStatement [Yield]:返回[此处没有LineTerminator]表达式[In,?Yield];
> ThrowStatement [Yield]:抛出[此处没有LineTerminator]表达式[In,?Yield];
> ArrowFunction [In,Yield]:ArrowParameters [?Yield] [此处没有LineTerminator] => ConciseBody [呢?]
> YieldExpression [In]:yield [此处没有LineTerminator] * AssignmentExpression [?In,Yield]
> YieldExpression [In]:yield [此处没有LineTerminator] AssignmentExpression [?In,Yield]
在这些作品中,我理解选择使大部分作品受到限制.限制PostfixExpression的生成以防止使用PrefixExpression解析歧义. ContinueStatement,BreakStatement和ReturnStatement具有受限制的产品,因为有相应的产品,其中break和continue不带标签,return不带表达式.我不能说我对箭头函数或屈服表达式了解得足以知道为什么它们受到限制,但我认为这是为了防止某种类似的解析模糊.
我不理解的制作是ThrowExpression.据我所知,使用throw时没有解析歧义,就像使用break,return和continue时一样:毕竟,throw;是无效的JavaScript.我认为这可能是出于历史原因,但据我所知,扔掉;从未在任何JavaScript规范中被允许.
这样做的实际结果就像返回一样,你不能把表达式抛到下一行,例如这是错的:
throw new Error("some error");
但是,与return不同,这与将新的Error()放在同一行上没有不同的行为.这只是一个语法错误:Chrome将其报告为
Uncaught SyntaxError: Illegal newline after throw
ThrowExpression的生产是否仅限于保持与类似结构的一致性?或者是否有一些我没有看到的歧义?
解决方法
我找不到任何关于这次讨论或最终解决方案的记录 – 虽然我们知道决议是什么 – 但是在2007年2月19日的会议上提到了它.我认为这是限制是让句法空间保持开放,以防有一天决定改变.