我应该在花括号后面用分号吗?

很多时候我在函数声明之后,或者在模块模式脚本的匿名“返回”函数之后看到了一个分号。 在大括号之后使用分号适合什么时候使用?

声明后使用分号。 这是一个声明:

var foo = function() { alert("bar"); }; 

因为它是一个variables赋值(即创build和分配一个匿名函数给variables)。

我们想到的两件事情就是函数声明:

 function foo() { alert("bar"); } 

并阻止:

 { alert("foo"); } 

注意:没有分号的同一个块结构也适用于fordowhile循环。

当你打算缩小你的代码时,这也是很重要的。

所以我个人在ASI中插入一个。

我用JavaScript写了一篇关于ASI的文章。

不要使用分号:

…如果这只是你的每日function宣言:

 function foo() { } // No semicolon 

使用分号:

…如果这是一个任务:

 var foo = function() { }; // Semicolon 

…或自我调用function:

 (function () { })(); // Semicolon 

你永远不需要; 你总是可以(除了之前和之后)。

说明:

不幸的是,Javascript分号是可选的。
因此,你永远不需要添加分号。

用分号终止每个语句是非常好的做法。
}结尾的唯一语句是以对象字面量(例如JSON)或函数expression式结尾的语句。

因此,最好的做法是将分号放在以下两个大括号之后(仅):

 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); 

这将产生以下输出:

“运行自我调用function
运行参数值为3的testMethod
testMethodtypes:数字,值:2
实例化testClass
我是比尔“

…加上浏览器报告的JavaScript错误: testOb.testMethod is not a function

这当然不是我们的意图。 为什么在我们甚至实例化类之前, testMethod立即运行? 为什么当我们想把它称为成员方法时,它不再存在?

发生了什么是testMethod不是我们的函数定义,而是函数定义的返回值。 而函数定义本身正在匿名运行。 这是如何:

  1. testClass构造函数和成员方法report已成功定义/分配。
  2. 由于testMethod定义之后缺less分号,围绕以下自我调用函数的()成为一个调用操作符,这导致我们认为我们定义的 testMethod成为立即调用的匿名函数,而以下匿名函数的返回值成为其参数列表。 这解释了打印输出的顺序 – 我们的自调用函数首先运行,因为它被作为参数进行评估。
  3. 由于我们预期的函数定义返回2,所以将这2分配给testMethod ,而不是函数定义。 这通过我们打印testMethod的types和值来testMethod
  4. 现在testClass已成功实例化为testOb ,其report方法按预期工作,certificate类定义是完整的。
  5. 当我们尝试调用testMethod ,解释器会告诉我们这不是一个函数 – 正确的是,因为它是一个数值为2的数字。

如果我们在testMethod的定义之后加上一个分号,它将把它的赋值和自调函数的调用分开,我们将得到我们期望的结果:

“运行自我调用function
实例化testClass
我是比尔
运行带参数值4的testMethod“

或者我们甚至可以把它放在匿名函数之前:

 ;(function() {... 

但是我build议,由于这个问题是由于在赋值语句的末尾没有分号引起的,所以我们也许应该习惯于在这样定义函数后总是用分号。 即上面的所有函数都应该在右大括号后面有一个分号,因为它们都是匿名函数的赋值。

在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()