为什么我应该在javascript中的每个函数后使用分号?

mac*_*ca1 277 javascript syntax

我见过不同的开发人员在javascript函数之后包含分号,而有些则没有.哪个是最佳做法?

function weLikeSemiColons(arg) {
   // bunch of code
};
Run Code Online (Sandbox Code Playgroud)

要么

function unnecessary(arg) {
  // bunch of code
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 420

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

a的语法FunctionDeclaration规范中描述如下:

function Identifier ( FormalParameterListopt ) { FunctionBody }
Run Code Online (Sandbox Code Playgroud)

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

分号用于将语句彼此分开,而a FunctionDeclaration不是声明.

FunctionDeclarations在代码进入执行之前进行评估,提升是用于解释此行为的常用词.

术语"函数声明"和"函数声明"经常被错误地互换使用,因为ECMAScript规范中没有描述函数声明,但是有些实现在语法中包含函数声明,特别是Mozilla-但是这个是非标准的.

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

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

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

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

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

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

第一个函数将立即执行,因为围绕第二个函数的括号将被解释为Arguments函数调用.

推荐讲座:

  • 编辑澄清,那篇文章谈到了**函数表达式** (2认同)
  • 这里的一些混乱可能是由于缺乏一个好的英语单词“允许,因为它将被忽略”而造成的。我们退回到说“可选”,但这具有误导性,因为它表明声明后不包含分号与声明后不包含分号属于同一类别。后者在完全不同的意义上是可选的:这是因为解析器将*添加您省略的缺少的分号*,而在这种情况下,这是因为解析器将*忽略您包含的分号*。换句话说:如果一个是可选的,那么*八*也是可选的。 (2认同)
  • 最后一个例子是一个很好的例子。在这种情况下省略分号会导致极其奇怪且难以调试的错误。全心全意地投赞成票。 (2认同)

Gab*_*art 38

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

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

但不是经典风格的定义:

function f() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 但是 - 对于提问者 - *为什么*? (5认同)

Dav*_*und 20

JS Lint是事实上的约定,它在函数体之后没有分号.请参阅"分号"部分.

  • 我亲眼目睹了由于缺少分号而失败的功能.我完全不同意将其废弃是一种惯例.虽然有99.99%的时间不会破坏,但在某些情况下,我注意到IE在没有分号的情况下无法插入JavaScript. (10认同)
  • 我的回答仅涉及函数定义,例如问题的两个例子.在这些情况下,在*any*浏览器中,*any*情况下不需要终止分号.我想你可能会想到函数表达式.它们是完全不同的问题,而不是原始问题中提到的问题. (8认同)

Jos*_*ola 7

保持稳定!它们不是必需的,但我个人使用它们是因为大多数缩小技术都依赖于分号(例如,Packer).


reg*_*gex 5

真的只是取决于你的偏好.我喜欢用半冒号结束代码行,因为我已经习惯了Java,C++,C#等,所以我在javascript中使用相同的标准进行编码.

我通常不会在半冒号中结束函数声明,但这只是我的偏好.

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

我写的代码示例:

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

  • @david:在那种情况下,缩小器肯定会坏掉吗? (9认同)

Mas*_*son 5

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

我相当确定,不在每个语句后面放置分号会减慢内部解析器的速度,因为它必须找出语句的结尾在哪里。我希望我有一些方便的数字供您肯定地确认这一点,但也许您可以自己用谷歌搜索。:)

此外,当您压缩或缩小代码时,缺少分号可能会导致脚本的缩小版本无法执行您想要的操作,因为所有空白都会消失。

  • 问题是针对分号是否必须在函数之后,而不是每个语句之后。我同意你应该在每个语句后面加上分号,并且我看到其他 stackoverflow 共识也这么说。 (3认同)