[英]Why is “throw” a restricted production for automatic semicolon insertion?
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");
但是,與return
不同,這與將new Error()
放在同一行上沒有不同的行為。 這只是一個語法錯誤:Chrome將其報告為
未捕獲的SyntaxError:拋出后非法換行
ThrowExpression的生產是否僅限於保持與類似結構的一致性? 或者是否有一些我沒有看到的歧義?
我們只能猜測為什么語言作者決定這樣做,但我會說這是為了與return
保持一致。 如果要完成throw ¶ value
則禁止return ¶ value
和throw ¶ value
value
。 無論如何throw
都沒有歧義並不重要。
我認為adeneo的評論是在正確的軌道上:像return
一樣, throw
的操作數通常是一個有效的表達式。 return \\n "valid on its own";
的問題return \\n "valid on its own";
是ASI問題最常見的例子之一,所以限制return
和任何其他采用這樣的價值的陳述是一個合理的保障。
查看列表,其中大多數是一元運算符(或看起來像一個)。 它們都遵循相同的一般形式,箭頭函數除外。 該形式是ASI錯誤的原因,因此限制整個類別比僅return
更可預測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.