微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 为什么“抛出”限制生产自动分号插入?

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

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的生产是否仅限于保持与类似结构的一致性?或者是否有一些我没有看到的歧义?

解决方法

当在1998年左右将throw添加到语言中时,讨论了throw语句是否需要表达式. (另一种方法是没有表达式的throw会重新抛出当前的异常对象,如 certain other languages所示.)

我找不到任何关于这次讨论或最终解决方案的记录 – 虽然我们知道决议是什么 – 但是在2007年2月19日的会议上提到了它.我认为这是限制是让句法空间保持开放,以防有一天决定改变.

原文地址:https://www.jb51.cc/js/150417.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐