Javascript 函数声明后是否需要分号?

Javascript 函数声明后是否需要分号?,javascript,Javascript,可能重复: 有人在函数声明后添加了分号,但有人没有。在函数声明后添加分号是一种好的做法吗 function test(o) { } function test(o) { }; 没有 定义这样的函数时不需要分号 但是,如果您定义这样的函数: var test = function (o) { } function test () {} (function (window, document, undefined) { /* do stuff */ }(window, document));

可能重复:

有人在函数声明后添加了分号,但有人没有。在函数声明后添加分号是一种好的做法吗

function test(o) {
}

function test(o) {
};
没有

定义这样的函数时不需要分号

但是,如果您定义这样的函数:

var test = function (o) {
}
function test () {}
(function (window, document, undefined) { /* do stuff */ }(window, document));
这不是严格必要的,但是您可能想要使用它们,特别是如果您将函数放在一行上

第一种方法定义函数,第二种方法将函数分配给变量,因此是语句。大多数语句以分号分隔。定义函数可以被视为一个常见的反例,因为使用函数的人并不多。

a不需要(也不应该)在后面加分号:

function test(o) {
}
但是,如果将函数编写为,如下面的变量初始值设定项,则该语句应以分号结尾,就像其他语句一样:

var a = function test(o) {
};

有关分号和函数声明的详细信息,请参见:

function test(o) {
    // body
} // semicolon no

var test = function (o) {
    // body
}; // semicolon yes

有关设置代码格式的问题,请参阅。

对于浏览器来说,这无关紧要。就语义而言,仅当您正在原型化一个函数或使用function语句时,它才起作用

function stuff(stuff) {
     alert(stuff);
} //don't need a semicolon

Object.prototype.stuff = function(stuff) {
    alert(stuff);
}; //need a semicolon
var stuff = function(stuff) {
    alert(stuff);
}; //need a semicolon

定义函数时不需要分号,但使用分号也不是错误

但是有一个例外,如果使用函数包装器并传递参数,则需要在两者之间添加分号,例如:

(function(v){alert(v)})('1');
(function(s){alert(s)})('0')
  • 否则将导致错误:

。。。否则,请忘记它们…

实际发生的情况是,在函数后面添加了一个空语句

function test (o) { return o; };
可被视为类似于:

var test = 0;;
第二个分号本身不是一个错误。浏览器将其视为一条绝对没有发生任何事情的语句

这里有两件事要记住

这仅适用于函数声明和控制块(for/if/while/switch/etc)

函数声明应该在作用域的底部定义,这样您就不会遇到如下问题:

var test = function (o) {
}
function test () {}
(function (window, document, undefined) { /* do stuff */ }(window, document));
因为浏览器将假定您的意思是
function test(){}(/*返回闭包的值*/)
这是一个错误。这是一个很容易被忽视的严重错误

但这没关系,因为函数声明可以在return语句下进行,并且仍然可以正常工作

所以即使你想去:

function doStuff () {
    return (function () { /*process stuff*/ test(); }());
    function test () {}
}

这将非常有效。

这可能是相关的:。总结:用
结束在赋值表达式中声明函数时(即
var f=function(){}
)。在第二种类型的函数声明中也不需要分号。代码运行后没有任何问题。我想你的意思是把函数写成表达式而不是语句;函数声明也是语句,表达式也是语句(所有表达式都是语句,但并非所有语句都是表达式)。为什么函数声明不需要分号?变量声明和变量调用使用分号,但只有函数调用而不是函数声明使用分号,这似乎很奇怪。