为什么要在javascript中的每个函数之后使用分号?


282

我已经看到不同的开发人员在javascript函数中包含分号,而有些还没有。哪个是最佳做法?

function weLikeSemiColons(arg) {
   // bunch of code
};

要么

function unnecessary(arg) {
  // bunch of code
}

Answers:


424

分号后函数的声明没有必要的

a的语法FunctionDeclaration规范中描述为:

function Identifier ( FormalParameterListopt ) { FunctionBody }

语法上没有分号,但是可能想知道为什么?

分号用于将语句彼此分开,并且a FunctionDeclaration不是语句

FunctionDeclarations在代码执行之前进行评估,起吊是用来解释这种行为的常用词

术语“函数声明”和“函数声明”通常会错误地互换使用,因为ECMAScript规范中没有描述函数声明,但是有一些实现在其语法中包括函数声明,特别是Mozilla,但同样是非标准的。

但是,始终建议在使用的地方使用分号FunctionExpressions,例如:

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

(function () {
  //...
})();

如果在上面的示例中的第一个函数之后省略分号,则将得到完全不希望的结果:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

第一个功能将立即执行,因为第二个功能的括号将被解释为Arguments函数调用的。

推荐讲座:


2
编辑进行澄清,该文章讨论函数表达式
CMS

1
我并不完全熟悉ECMA,但这也是我使用的标准。好帖子。我在网上看到的大多数tut和DL都使用该标准的代码示例,因此我适应了它。
regex

1
这里有些混乱可能是由于缺少一个良好的英语单词“允许的,因为它将被忽略”所影响。我们回过头说“可选”,但这具有误导性,因为它表明声明后不包括分号与声明后不包括分号属于同一类别。后者在完全不同的意义上是可选的:这是因为解析器将添加您省略的缺少的分号,而在这种情况下,这是因为解析器将忽略您包括的分号。换句话说,如果一个是可选的,那么八个也是可选的。
分号

现在,链接“命名的函数表达式已神秘化”链接到一个无效的URL,Web归档文件在此处具有副本:web.archive.org/web/20100426173335/http
Tony

最后一个例子是一个很好的例子。在这种情况下,省略分号会导致极其奇怪且难以调试的错误。全心全意地投票。
Yan Yankowski

38

我在函数变量声明后使用它们:

var f = function() { ... };

但不遵循古典风格的定义:

function f() {
    ...
}

NetBeans以及其他IDE都喜欢在像this这样的函数变量之后看到分号。animaton_fun = function(){...};
Lance Cleveland

6
但是-对于发问者- 为什么
路加福音

它在构建步骤中有帮助。当uglifier脚本看到分号时,不需要在输出文件中添加换行符,否则,将生成换行符并且文件会稍大。
autoboxer

20

JS Lint实际上是约定俗成的,它说在函数体之后没有分号。请参阅“分号”部分。


10
我亲眼目睹了由于缺少分号而导致函数失败的情况。我完全不同意将其保留为惯例。尽管99.99%的时间不会中断,但在某些情况下,我注意到IE在没有分号的情况下无法插入JavaScript。
MillsJROSS

8
我的回答仅涉及函数定义,例如问题的两个示例。在这些情况下,在任何情况下任何浏览器都不需要终止分号。我想您可能正在考虑函数表达式。他们是完全不同的问题,而不是原始问题中解决的问题。
David Hedlund

var myFunction = function(arg){console.log(arg); }(function(){console.log('完全无关的功能');返回'看看会发生什么';}());
Maciej Krawczyk '02

@MillsJROSS我是David的第二个回应,如果您详细阐述遇到的失败,我将很高兴。它确实是IE的函数表达式或bug吗?
wlnirvana


5

真的只是取决于您的喜好。我喜欢用半冒号结束代码行,因为我已经习惯了Java,C ++,C#等,因此我使用相同的标准来编写javascript。

我通常不会以半冒号结尾函数声明,但这只是我的偏爱。

浏览器将以任何一种方式运行它,但是也许有一天他们会提出一些更严格的标准来管理它。

我会写的代码示例:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
行绝对应该以分号结尾。否则,一个压缩程序可能会完全破坏功能
David Hedlund

9
@david:在这种情况下,粉碎机损坏了吗?
DisgruntledGoat

同意 这是为来自C / C ++背景的人们(如我)编码的一种自然方法。这也使代码更具可读性。
Anshuman Manral

3

实际上,这不仅仅是一个约定或一致性问题。

我相当确定,在每个语句后放置分号会使内部解析器变慢,因为它必须弄清楚语句结尾在哪里。希望我能提供一些方便的数字,让您肯定地确认这一点,但是也许您可以自己用Google搜索。:)

另外,在压缩或压缩代码时,缺少分号可能会导致脚本的缩小版本无法实现您想要的功能,因为所有空白都消失了。


3
这个问题针对的是分号是否必须在功能之后,而不是每个陈述之后。我同意您应该在每条语句后放置分号,而且我也看到了其他stackoverflow共识。
macca1

1
商定的,并且不能在函数后加上分号将导致我提到的缩小问题。先生,祝你好运。
梅森

Upvote'的原因是强化缩小问题澄清了我的理解
JackW327 '16

1

当我缩小脚本时,我意识到我需要对以等号开头的功能使用分号。如果将函数定义为var,是的,您需要使用分号。

需要分号

var x = function(){};
var x = new function(){};
this.x = function(){};

不需要分号

function x(){}

0

简单:

好的习惯是;在函数括号结束后离开分号。多年来,它们一直被认为是最佳实践。

始终使用它们的一个好处是,如果您想最小化JavaScript。

在缩小Javascript的同时,有助于减小文件大小。

但是,关于上述最佳做法和答案,建议不要在功能标签后使用它。

如果您不使用分号,并且您想缩小代码(例如,如果许多开发人员的站点提供了大量JavaScript,那么它们就很多),您可能会遇到各种各样的错误/警告。


0

使用功能后的分号不需要使用或不使用它,不会在程序中引起错误。但是,如果您打算精简代码,则在函数后使用分号是个好主意。例如说你有下面的代码

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

当两者都缩小时,您将获得以下输出

请注意,注释仅供参考

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.