簡體   English   中英

為什么“拋出”限制生產自動分號插入?

[英]Why is “throw” a restricted production for automatic semicolon insertion?

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解析歧義。 ContinueStatementBreakStatementReturnStatement具有受限制的產品,因為有相應的產品,其中breakcontinue不帶標簽, return不帶表達式。 我不能說我對箭頭函數或屈服表達式了解得足以知道為什么它們受到限制,但我認為這是為了防止某種類似的解析模糊。

我不理解的制作是ThrowExpression 據我所知,使用throw時沒有解析歧義,就像使用breakreturncontinue :畢竟, throw; 是無效的JavaScript。 我認為這可能是出於歷史原因,但據我所知, throw; 從未在任何JavaScript規范中被允許。

這樣做的實際結果就像return ,你不能把表達式拋到下一行,例如這是錯誤的:

throw
new Error("some error");

但是,與return不同,這與將new Error()放在同一行上沒有不同的行為。 這只是一個語法錯誤:Chrome將其報告為

未捕獲的SyntaxError:拋出后非法換行

ThrowExpression的生產是否僅限於保持與類似結構的一致性? 或者是否有一些我沒有看到的歧義?

當在1998年左右將throw添加到語言中時,討論了throw語句是否需要表達式。 (另一種方法是沒有表達式的throw會重新拋出當前的異常對象,就像某些其他語言一樣 。)

我找不到任何關於這次討論或最終解決方案的記錄 - 盡管我們知道該決議是什么 - 但是在1998年2月19日的會議的TC39會議記錄中提到了這一點。我認為這意味着限制是讓句法空間保持開放,以防有一天決定改變。

我們只能猜測為什么語言作者決定這樣做,但我會說這是為了與return保持一致。 如果要完成throw ¶ value則禁止return ¶ valuethrow ¶ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM