我不能很好地理解规范中的这 3 条规则——希望有一些更简单的英语——但这是我从 JavaScript 收集的内容:权威指南,第 6 版,David Flanagan,O'Reilly,2011:
引用:
JavaScript 不会将每个换行符都视为分号:它通常仅在无法解析没有分号的代码时才将换行符视为分号。
另一个引用:对于代码
var a
a
=
3 console.log(a)
JavaScript 不会将第二个换行符视为分号,因为它可以继续解析更长的语句 a = 3;
和:
当 JavaScript 无法将第二行解析为第一行语句的延续时,JavaScript 将换行符解释为分号的一般规则有两个例外。第一个例外涉及 return、break 和 continue 语句
...如果在这些单词中的任何一个之后出现换行符... JavaScript 将始终将该换行符解释为分号。
...第二个例外涉及 ++ 和 −− 运算符 ...如果您想将这些运算符中的任何一个用作后缀运算符,它们必须与它们所应用的表达式出现在同一行。否则,换行符将被视为分号,而 ++ 或 -- 将被解析为应用于后面代码的前缀运算符。考虑这段代码,例如:
x
++
y
它被解析为x; ++y;
,而不是x++; y
所以我认为简化它,这意味着:
一般来说,只要有意义,JavaScript 就会将其视为代码的延续——除了 2 种情况:(1) 在一些关键字之后,如return
, break
, continue
, 和 (2) 如果它看到++
或--
在新行上,那么它将添加在;
上一行的末尾。
“只要有意义就将其视为代码的延续”的部分让人感觉像是正则表达式的贪婪匹配。
如上所述,这意味着对于return
换行符,JavaScript 解释器将插入一个;
(再次引用:如果在这些单词中的任何一个之后出现换行符 [例如return
] ... JavaScript 将始终将该换行符解释为分号)
由于这个原因,经典的例子
return
{
foo: 1
}
将无法按预期工作,因为 JavaScript 解释器会将其视为:
return; // returning nothing
{
foo: 1
}
之后必须没有换行符return
:
return {
foo: 1
}
使其正常工作。;
如果您要遵循;
在任何语句之后使用 a 的规则,您可以自己插入 a :
return {
foo: 1
};