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(){}
)。在第二种类型的函数声明中也不需要分号。代码运行后没有任何问题。我想你的意思是把函数写成表达式而不是语句;函数声明也是语句,表达式也是语句(所有表达式都是语句,但并非所有语句都是表达式)。为什么函数声明不需要分号?变量声明和变量调用使用分号,但只有函数调用而不是函数声明使用分号,这似乎很奇怪。