在JavaScript中执行函数时,我总是默认使用分号结束我的代码块,因为这是我所教过的。来自Java,起初感觉有点不正统,但语法是语法。
function semiColon(args) {
// code block here
};
或
function sloppyFunction(args) {
// code block here
}
最近我看到越来越多的代码,开发人员在函数之后离开分号,但目标代码仍然正常执行。那他们真的需要吗?如果没有,为什么通常的做法包括它们?他们是否有其他目的?
答案 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