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

52 javascript

在许多情况下,如果您将它们遗漏,JavaScript解析器将为您插入分号.我的问题是,你把它们遗弃了吗?

如果您不熟悉规则,则会在Mozilla网站上对分号插入进行描述.这是关键点:

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

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

此stackoverflow问题是相关的,但仅涉及特定方案.

小智 74

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

  • 理性的讨论胜于偏见. (9认同)
  • 为什么希望JS解释器能够正确地猜测你的意图(不仅仅是现在,而且只需要很少的代码更改),只需添加分号并明确地传达它们即可? (6认同)
  • 关于js分号的精彩文章:http://mislav.uniqpath.com/2010/05/semicolons/ (4认同)

小智 44

在没有分号的情况下打破的模糊情况:

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

// then execute some code inside a closure
(function () {
    //...
})();
Run Code Online (Sandbox Code Playgroud)

这将被解释为:

var fn = function () {
    //...
}(function () {
    //...
})();
Run Code Online (Sandbox Code Playgroud)

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

  • 这实际上是换行符无法替换分号的_one_示例.我养成了任何一条开头的习惯(在它前面都有一个分号(所以`;(function(){`) (5认同)
  • 哇,我总是在语句的末尾添加一个分号,看起来像`var foo ="bar";`但是我不知道它们应该在函数的末尾,我认为结束括号结束了语句?那么我应该在所有块语句之后加上分号,比如`if`,`while`等呢? (2认同)
  • @John:不.请注意,我的示例涉及函数的_assignment_.您不需要 - 也不应该 - 在常规函数或代码块上放置分号. (2认同)

小智 16

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

试试http://www.jslint.com/ ; 它会伤害你的感情,但会告诉你许多方法来编写更好的JavaScript(其中一种方法是始终使用分号).

  • 如果你的javascript压缩器可能会破坏你的javascript代码,我建议你尽快使用另一个. (32认同)

小智 11

每个人似乎都想念的是JavaScript中的分号不是语句终止符而是语句分隔符.这是一个微妙的差异,但它对解析器的编程方式很重要.像对待他们一样对待他们,你会发现离开他们会感觉更自然.

我已用其他语言编写,其中分号是一个语句分隔符,也是可选的,因为解析器在新行上执行"分号插入",它不会破坏语法.所以当我在JavaScript中找到它时,我并不陌生.

我不喜欢语言中的噪音(这是我对Perl不好的一个原因)而且半冒号是JavaScript中的噪音.所以我省略了它们.


小智 10

我说一致性比保存几个字节更重要.我总是包括分号.

另一方面,我想指出有很多地方分号在语法上是不需要的,即使压缩器正在对所有可用的空格进行核对.例如,在块的结尾.

if (a) { b() }
Run Code Online (Sandbox Code Playgroud)


小智 8

JavaScript会在解释代码时自动插入分号,因此如果将return语句的值放在行下面,则不会返回:

你的代码:

return
5
Run Code Online (Sandbox Code Playgroud)

JavaScript解释:

return;
5;
Run Code Online (Sandbox Code Playgroud)

因此,由于JavaScript的自动分号插入,没有返回任何内容

  • 这是事实,但与问题无关.在这种情况下,明确使用分号无济于事. (14认同)

小智 7

我认为这与上一次播客讨论的内容类似."你接受的是自由主义"意味着必须在Javascript解析器中加入额外的工作来修复分号被遗漏的情况.现在我们有一大堆页面出现错误的语法,当某些浏览器决定对它接受的内容稍微严格一些时,可能会在未来的某一天中断.此类规则也应适用于HTML和CSS.您可以编写损坏的HTML和CSS,但是当某些浏览器无法正确解释您的错误代码时,如果您变得奇怪且难以调试行为,则不会感到惊讶.


小智 6

JavaScript中的Semicolons文章是可选的,它提供了一些关于不在Javascript中使用半冒号的好点.它涉及这个问题的答案提出的所有要点.


小智 5

这是我在任何地方找到的自动分号插入的最佳解释.它将清除你所有的不确定性和怀疑.