您是否建议在 JavaScript 中的每个语句后使用分号?

IT技术 javascript
2021-01-27 01:42:14

在许多情况下,JavaScript 解析器会为您插入分号,如果您将它们排除在外。我的问题是,你把它们排除在外了吗?

如果您不熟悉规则,Mozilla 站点上有关于插入分号的说明这是关键点:

如果第一至第nJavaScript程序形式的令牌是语法上有效,但第一至第n + 1个ST令牌是不与存在n之间的换行符令牌和第n + 1 ST令牌,则解析器试图插入n个令牌之间的虚拟分号后再次解析程序和第n + 1 ST令牌。

该描述可能不完整,因为它没有解释@Dreas 的示例。任何人都有完整规则的链接,或者看看为什么这个例子有一个分号?(我在 JScript.NET 中尝试过。)

这个stackoverflow问题是相关的,但只讨论了一个特定的场景。

6个回答

是的,您应该在 JavaScript 中的每个语句之后使用分号。

理性讨论总比选边站好。
2021-03-11 01:42:14
为了一致性和未来的可读性,在每个语句后都包含分号。+1
2021-03-12 01:42:14
当您只需添加分号并明确传达它们时,为什么希望 JS 解释器能够正确地猜测您的意图(不仅仅是现在,而是对代码进行较小的更改)?
2021-03-13 01:42:14
关于 js 分号的好文章:mislav.uniqpath.com/2010/05/semicolons
2021-03-21 01:42:14
如果一种语言在某些情况下需要分号,我会采用分号并将其应用于所有情况,如果可能的话,仅仅是为了代码更易于阅读和代码看起来不错。所以... +1。
2021-03-22 01:42:14

在没有分号的情况下中断的模棱两可的情况:

// define a function
var fn = function () {
    //...
} // semicolon missing at this line

// then execute some code inside a closure
(function () {
    //...
})();

这将被解释为:

var fn = function () {
    //...
}(function () {
    //...
})();

我们最终将第二个函数作为参数传递给第一个函数,然后尝试将第一个函数调用的结果作为函数调用。第二个函数将在运行时失败并显示“...不是函数”错误。

感谢分享这个——这个确切的用例发生在集成来自两个不同来源的代码时。我们发现它可以用分号快速修复,但不确定根本原因。
2021-03-14 01:42:14
这实际上是换行符不能替换分号一个例子。我习惯于任何以 ( 开头的行都有一个分号 (so ;(function() {)
2021-04-04 01:42:14
哇,我总是在看起来像的语句末尾放一个分号,var foo = "bar";但我不知道它们应该在函数的末尾,我认为右括号结束了语句?所以,我应该把一个分号像所有的语句块后ifwhile等吗?
2021-04-05 01:42:14
@John:不。请注意,我的示例涉及函数赋值您不需要——也不应该——在常规函数或代码块上放置分号。
2021-04-09 01:42:14

是的,您应该始终使用分号。为什么?因为如果您最终使用 JavaScript 压缩器,您的所有代码都将在一行上,这会破坏您的代码。

试试http://www.jslint.com/它会伤害您的感情,但会向您展示许多编写更好 JavaScript 的方法(其中一种方法是始终使用分号)。

如果您的 javascript 压缩器可以破坏您的 javascript 代码,我建议您尽快使用另一个。
2021-03-30 01:42:14

每个人似乎都忽略了 JavaScript 中的分号不是语句终止符而是语句分隔符这是一个微妙的区别,但它对解析器的编程方式很重要。像对待它们一样对待它们,您会发现将它们排除在外会感觉更自然。

我已经用其他语言编程,其中分号是语句分隔符,也是可选的,因为解析器在不破坏语法的换行符上执行“分号插入”。所以当我在 JavaScript 中发现它时,我对它并不陌生。

我不喜欢语言中的噪音(这是我不擅长 Perl 的一个原因),分号是 JavaScript 中的噪音。所以我省略了它们。

我会说一致性比节省几个字节更重要我总是包括分号。

另一方面,我想指出很多地方在语法上不需要分号,即使压缩器正在破坏所有可用的空格。例如在块的末尾。

if (a) { b() }
现代压缩器将插入分号mislav.uniqpath.com/2010/05/semicolons
2021-03-28 01:42:14
在这种特殊情况下,您可以节省几个字节在 if (a) b; 中使用分号;
2021-04-01 01:42:14