簡體   English   中英

難以理解分號插入

[英]Trouble understanding semicolon insertion

據此,如果出現以下情況 ,JavaScript將插入分號:

當程序包含正式語法不允許的標記時,如果(a)在該點有換行符,或(b)意外標記是右括號,則插入分號。 (強調我的)

經典的例子是

return  //  <--- semicolon inserted there
{
   id: 12
};

這讓我相信自由立場{無效。 然而,以下(無意義)代碼警告2,沒有錯誤

function foo() {
    var x = 1;
    {
        var y = 2; //yes, I know y has the same scope as x 
    }              //and that this is therefore pointless
    alert(y);
}

為什么在第一個代碼中將左大括號視為無效標記,這導致JavaScript插入分號,但是在第二個代碼中開括號不被視為無效 - 正如沒有錯誤的事實所證明的那樣。

很明顯,我的一個假設是錯誤的,我希望有人可以幫助我理解哪些。

您提到的return語句問題不受分號插入規則的特定方面的影響。 相反,它就是這個:

當從左到右解析程序時,遇到某些語法生成所允許的令牌,但是生產是限制生產,並且令牌將是緊跟注釋之后的終端或非終端的第一個令牌 - 限制生產中的[此處沒有LineTerminator]‖(因此這樣的令牌稱為受限令牌),並且受限令牌通過至少一個LineTerminator與前一個令牌分開,然后在受限令牌之前自動插入分號。

碰巧return語句語法中有一個“[此處沒有LineTerminator]”怪癖。

參見ES 5規范的第7.9.1節。

規則是這樣的:如果有一個新行,並且到目前為止我們有一個有效的語句,那么插入一個分號。

在您的第一個示例中,這是有效的:

return;  //  <--- semicolon inserted there
{
   id: 12
};

在第二個示例中,這是無效的:

function foo() {
    var x = 1;
    {;             // *not a valid insertion*
        var y = 2; // yes, I know y has the same scope as x 
    }              // and that this is therefore pointless
    alert(y);
}

編輯:這個答案並不完全正確! 例如:

num = 4 + 5
  + 1;

// returns 10

見下面的評論:

你在談論期望塊和關鍵字期望表達式的關鍵字 - return不像function或者if期望塊( { } ) - 所以解析器將像其他關鍵字一樣插入分號而不是期望括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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