使用分号来关闭JavaScript中的函数。必要?

时间:2016-03-18 18:21:30

标签: javascript function

在JavaScript中执行函数时,我总是默认使用分号结束我的代码块,因为这是我所教过的。来自Java,起初感觉有点不正统,但语法是语法。

function semiColon(args) {
   // code block here
};

function sloppyFunction(args) {
   // code block here
}

最近我看到越来越多的代码,开发人员在函数之后离开分号,但目标代码仍然正常执行。那他们真的需要吗?如果没有,为什么通常的做法包括它们?他们是否有其他目的?

3 个答案:

答案 0 :(得分:1)

函数声明不需要使用分号,但如果你在那里放置一个分号,它就不会有害,它只是一个多余的empty statement

function semiColon(args) {
   // code block here
};;;; // 4 empty statements

大多数语句都需要使用分号,但是如果您将分号排除在外,则大多数情况下会自动插入Automatic Semi-Colon Insertion,但需要注意。通常,在您的陈述之后总是更容易添加分号,这样您和其他使用代码的开发人员就不必担心这些警告。

此代码是正确的:

function semiColon(args) {
   // code block here
} // No need for semi-colon

var semiColon = function (args) {
   // code block here
}; // Semi-colon required here

虽然这段代码错了,但通常仍会有效:

function semiColon(args) {
   // code block here
}; // Redundant unnecessary Empty Statement 

var semiColon = function (args) {
   // code block here
} // Semi-colon required here,
// but ASI will sometimes insert it for you, depending on
// the subsequent token

答案 1 :(得分:1)

否 - 在JavaScript中不需要使用分号结束function declarations。虽然它们不会抛出错误,但它们相当于使用多个分号来结束一行代码 - 无害,但不必要。作为多余的,他们被认为是糟糕的风格和编程实践。

一个例外是函数表达式,例如

var my_function = function(a, b){ };

您需要使用分号来终止该行。

答案 2 :(得分:0)

在函数声明后不得添加分号。

因为,在检查Javascript语法之后:

  • StatementList

    • StatementListItem
    • StatementList
  • StatementListItem

    • Statement
    • Declaration
  • Declaration

    • HoistableDeclaration
    • ClassDeclaration
    • LexicalDeclaration
  • HoistableDeclaration

    • FunctionDeclaration
    • GeneratorDeclaration

这是函数的语法生成:

FunctionDeclaration → HoistableDeclaration → Declaration → StatementListItem → StatementList

证明我之前的回复错误(不需要查看以前的编辑,因为它错了!;))。

function xx() {}构造单独是一个特例,既不是严格来说 - 一个语句或一个表达式,因此 NOT 以分号结束。

如果你正在使用表达式function()构造,你只需要添加一个分号(或让ASI处理它),当它是一个语句的一部分时就存在。要使其成为声明,您需要将其作为声明的一部分:

var foo = function() {};

或嵌入另一个表达式中:

(function() {})();
!function x() { ... }();

在任何一种情况下,显然都需要在完整语句的末尾添加分号。

一般来说,我喜欢python mantra “显然比隐含更好”所以当你犹豫要添加一个ASI会添加的分号时,只需添加它。

抱歉在我的答案的第一个版本中出错了,我会调试一些PHP代码作为忏悔。 ☺

HTH