Wil*_*kel 6 javascript grammar
JavaScript的自动分号插入算法的一部分是所谓的"限制性制作".这些是句法形式,禁止在某一点发生换行符.引用ECMAScript 2015规范:
如果短语"[ 此处没有LineTerminator ]"出现在句法语法生成的右侧,则表示生产是限制生产:如果LineTerminator出现在输入流中,则可能无法使用它.指示的位置.
ECMAScript 2015规范中有10个限制产品:
++--continue [ 此处没有LineTerminator ] LabelIdentifier [?Yield] ;break [ 此处没有LineTerminator ] LabelIdentifier [?Yield] ;return [ 此处没有LineTerminator ] 表达式 ;return [ 此处没有LineTerminator ] 表达式[In,?Yield] ;throw [ 此处没有LineTerminator ] 表达式[In,?Yield] ;=> ConciseBody [?In]yield [ 此处没有LineTerminator ] * AssignmentExpression [?In,Yield]yield [ 此处没有LineTerminator ] AssignmentExpression [?In,Yield]在这些作品中,我理解选择使大部分作品受到限制.限制PostfixExpression的生成以防止使用PrefixExpression解析歧义.ContinueStatement,BreakStatement和ReturnStatement具有受限制的产品,因为有相应的产品,其中break和continue不带标签,return不带表达式.我不能说我对箭头函数或屈服表达式了解得足以知道为什么它们受到限制,但我认为这是为了防止某种类似的解析模糊.
我不理解的制作是ThrowExpression.据我所知,没有涉及到使用无歧义解析throw使用时像有break,return和continue:毕竟,throw;不是有效的JavaScript.我认为这可能是出于历史原因,但据我所知throw;,从未在任何JavaScript规范中被允许.
这样做的实际结果就像return你一样,你不能把表达式抛到下一行,例如这是错误的:
throw
new Error("some error");
Run Code Online (Sandbox Code Playgroud)
但是,与return此不同,这与将其new Error()放在同一行上没有不同的行为.这只是一个语法错误:Chrome将其报告为
未捕获的SyntaxError:抛出后非法换行
ThrowExpression的生产是否仅限于保持与类似结构的一致性?或者是否有一些我没有看到的歧义?
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |