我不太理解规范中的这 3 条规则——希望有一些更简单的英语——但这是我从 JavaScript 收集的:权威指南,第 6 版,大卫弗拉纳根,奥莱利,2011 年:
引用:
JavaScript 不会将每个换行符都视为分号:它通常仅在无法解析没有分号的代码时才将换行符视为分号。
另一个引用:对于代码
var a
a
=
3 console.log(a)
JavaScript 不会将第二个换行符视为分号,因为它可以继续解析更长的语句 a = 3;
和:
JavaScript 将换行符解释为分号的一般规则的两个例外,当它无法将第二行解析为第一行语句的延续时。第一个异常涉及 return、break 和 continue 语句
... 如果在这些单词中的任何一个之后出现换行符... JavaScript 将始终将该换行符解释为分号。
... 第二个例外涉及 ++ 和 −− 运算符 ... 如果您想将这些运算符中的任何一个用作后缀运算符,它们必须与它们所应用的表达式出现在同一行。否则,换行符将被视为分号,++ 或 -- 将被解析为应用于后续代码的前缀运算符。考虑这个代码,例如:
x
++
y
它被解析为x; ++y;
,而不是x++; y
所以我认为简化它,这意味着:
在一般情况下,JavaScript的把它当作码延续,只要它是有道理的-除了两种情况:(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
};