很多次我看到在函数声明之后使用分号,或者在模块模式脚本的匿名“返回”函数之后使用分号。花括号后用分号是否合适?
您在声明后使用分号。这是一个声明:
var foo = function() {
alert("bar");
};
因为它是一个变量赋值(即为变量创建和赋予匿名函数)。
想到的不是语句的两件事是函数声明:
function foo() {
alert("bar");
}
和块:
{
alert("foo");
}
注意:没有分号的相同块构造也适用于for
,do
和while
循环。
......如果只是你的日常功能声明:
function foo() {
} // No semicolon
......如果是作业:
var foo = function() {
}; // Semicolon
...或自我调用功能:
(function () {
})(); // Semicolon
你永远不需要;你总能(除了else
和while
之前)。
不幸的是,Javascript分号是可选的。 因此,您永远不需要添加分号。
用分号终止每个语句是非常好的做法。
以}
结尾的唯一语句是以对象文字(例如JSON)或函数表达式结尾的语句。
因此,最佳做法是在以下两个括号之后添加分号(仅限):
var myFunc = function() { };
var myobject = { };
如果我们有一个自调用函数,我们需要在它之前加一个分号,否则它将成为前一个赋值语句的一部分。考虑以下:
testClass = function(name) {
document.write ("Instantiating testClass<br />");
this.name = name;
}
testClass.prototype.report = function() {
document.write ("I'm " + this.name + "<br />");
return 1;
}
testClass.prototype.testMethod = function(param) {
document.write ("Running testMethod with parameter value " + param + "<br />");
return 2;
} // notice that there is no semicolon here
(function() {
document.write ("Running self-invoking function<br />");
return 3;
}());
if (typeof(testClass.prototype.testMethod) !== "function") {
document.write ("testMethod type: " + typeof(testClass.prototype.testMethod));
document.write (", value: " + testClass.prototype.testMethod + "<br />");
}
var testOb = new testClass("Bill");
testOb.report();
testOb.testMethod(4);
这将产生以下输出:
“运行自我调用功能 运行参数值为3的testMethod testMethod类型:数字,值:2 实例化testClass 我是比尔“
...加上浏览器报告的JavaScript错误:testOb.testMethod is not a function
这当然不是我们想要的。为什么testMethod
会在我们甚至实例化课程之前立即运行?当我们想把它称为成员方法时,为什么它不再存在?
发生的事情是testMethod
不是我们的函数定义,而是函数定义的返回值。并且函数定义本身是匿名运行的。这是如何:
testClass
构造函数和成员方法report
。testMethod
定义之后缺少分号,围绕以下自调用函数的()
成为一个调用操作符,这导致我们认为我们对testMethod
的定义成为一个立即调用的匿名函数,并返回以下匿名函数的值成为其参数列表。这解释了打印输出的顺序 - 我们的自调用函数首先运行,因为它被评估为参数。testMethod
,而不是函数定义。我们印刷的testMethod
的类型和价值证实了这一点。testClass
被成功实例化为testOb
,其report
方法按预期工作,证明类定义完好无损。testMethod
时,解释器会告诉我们它不是函数 - 这是正确的,因为它是一个值为2的数字。如果我们在testMethod
的定义之后放了一个分号,它会将它的赋值与调用自调用函数分开,我们将得到我们期望的结果:
“运行自我调用功能 实例化testClass 我是比尔 运行参数值为4的testMethod“
或者我们甚至可以直接将它放在匿名函数之前:
;(function() {...
但我建议,由于问题是由于赋值语句末尾缺少分号,我们应该养成在以这种方式定义函数后总是加分号的习惯。即,我的所有函数在结束括号后应该有一个分号,因为它们都是匿名函数的赋值。
在Javascript中的函数内返回函数后,您还应该在大括号后使用分号。
function watchOut(problem) {
return function(number, location) {
alert("Be careful! There are " + problem +
" today!\n" +
number + " have been spotted at the " + location + "!"
);
};
}
分号位于不以大括号结尾的行的末尾或分隔同一行的语句。在闭合支撑后使用它们,或者穿吊带和腰带都没有坏处,但看起来确实有些讨厌。
我知道这个帖子已经老了但无法抗拒分享这段代码:
// this will break code
a=b=c=d=e=1
a = b + c //semicolon required here
(d + e).toString()
将返回“对象[对象对象]的属性不是函数”。因为它实际上将被执行为:
a = b + c(d + e).toString()