代码开头的分号仍然是好习惯吗?

Posted

技术标签:

【中文标题】代码开头的分号仍然是好习惯吗?【英文标题】:Is semicolon at the beginning of code still good practice? 【发布时间】:2013-02-08 05:22:51 【问题描述】:

有人告诉我,始终在 javascript 代码的开头插入分号是一种很好的做法,如下所示:

;(function()

)();

但是,很多流行的 JavaScript 库/框架并不使用这个,例如 jQuery、Backbone 等。

我相信开头的分号应该是为了防止坏代码破坏缩小/压缩的代码等。但是,为什么没有人再使用它了?

开头的分号是不是因为某种原因没用了?

【问题讨论】:

没有人再这样做了:你有什么样的证据来支持这个说法? 如果您想谈论“良好实践”,我会说将调用括号移到包含函数的括号内。 "函数调用前的分号是防止连接脚本和/或其他可能无法正确关闭的插件的安全网。" (jqueryboilerplate.com) 仅当您在同时加载/执行其他第 3 方脚本的页面上编写脚本时才需要。 您可能会考虑的另一件事是在代码的 end 处添加分号。它在语法上是正确的,它为附加到您的脚本添加了保护。 @mcpDESIGNS 不,没关系:(function()())(function())() 相同 【参考方案1】:

更常见的做法是在文件末尾添加分号。问题是,当您像这样连接两个文件时:

// file1.js
(function() 
)()

// file2.js
(function() 
)()

如果在file1 的末尾不加分号,它将尝试使用file2 中的函数调用file1 中的函数的返回值。 在每个文件的末尾加上一个分号可以解决这个问题(就像把它们放在开头一样)。

另一种方法是将函数调用变成这样的语句:

!function() 
();

我认为这也是 JSLint 推荐的,因为在这种情况下,您不必担心分号(尽管无论如何您都应该使用它们,但这完全是另外一个讨论;)。

【讨论】:

你有!function () (); 的用法示例吗?实际上,我以前从未见过这种语法! +1 Ben Alman 写了一篇很棒的文章:benalman.com/news/2010/11/…【参考方案2】:

理想情况下,压缩和合并多个文件应该不会影响您的编码风格。您应该能够按照自己的意愿编写程序,然后使用自动化工具正确合并和缩小您的项目。

有很多自动化工具可以做到这一点。以UglifyJS 2 为例。如果您环顾四周,我相信您将能够找到更多此类工具。

回到这个问题,正如 Daff 所指出的,在立即调用的函数表达式之后插入分号很重要。但是,没有理由在它前面加上分号。如果你是个好孩子,并且在每个语句和表达式后加上一个分号,那么你就不会有任何问题。

永远不要让 JavaScript 为您自动插入分号。

唯一可以不放分号的地方是函数声明之后:

function foo()  // it's alright to not put a semicolon here

但是,如果您使用的是函数表达式,那么请始终使用分号。

(function foo() )(); // you should put a semicolon here

将分号放在其他任何地方只会令人困惑。尤其是在一行的开头。其他编程背景的人也可能认为这是行尾注释的开始。

【讨论】:

“你应该可以随心所欲地编写程序……[然后一堆规则暗示你不应该随心所欲地编写程序]” 这是矛盾的。 "不要让 JavaScript 自动为你插入分号。" That's silly. "唯一允许不放分号的地方是函数声明” 错了。 “将分号放在其他地方只会令人困惑。” 这只是您的意见。 “其他编程背景的人也可能认为这是行尾注释的开始。”这无关紧要。

以上是关于代码开头的分号仍然是好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中更改参数是一种好习惯吗

大量使用静态成员变量是一种好习惯吗? [复制]

在循环中插入sql查询是好习惯还是坏习惯?

这是使用 WebView 而不是 Textview 的好习惯吗? [关闭]

在我的自定义函数中返回 double.NaN:这是一个好习惯吗?

@SessionScoped 是一个好习惯吗? [复制]