[英]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.