花括号后我应该何时使用分号?

时间:2010-04-27 00:27:53

标签: javascript syntax

很多次我看到在函数声明之后使用分号,或者在模块模式脚本的匿名“返回”函数之后使用了分号。花括号后用分号是否合适?

8 个答案:

答案 0 :(得分:94)

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

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

因为它是一个变量赋值(即创建一个匿名函数并为其赋值)。

首先想到的不是语句的两件事是函数声明:

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

和阻止:

{
  alert("foo");
}

注意:相同的没有分号的块构造也适用于fordowhile循环。

答案 1 :(得分:22)

当您打算缩小代码时,这也很重要。

所以我个人在每个}之后添加一个ASI将插入一个。

我写了一篇关于ASI in JavaScript的帖子。

答案 2 :(得分:16)

不要使用分号:

...如果只是你的日常功能声明:

function foo() {

} // No semicolon


使用分号:

......如果是作业:

var foo = function() {

}; // Semicolon


......或自我调用函数:

(function () {

})(); // Semicolon

答案 3 :(得分:10)

你永远不需要;你总能做到(elsewhile之前除外)。

说明:

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

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

因此,最佳做法是在以下两个括号后面加分号(仅限):

var myFunc = function() { };
var myobject = { };

答案 4 :(得分:5)

如果我们有一个自调用函数,我们需要在它之前放一个分号,否则它将成为前一个赋值语句的一部分。请考虑以下事项:

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


这将产生以下输出:

  

“运行自调用功能
运行testMethod with   参数值3
testMethod类型:数字,值:2
  实例化testClass我是Bill“

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

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

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

  1. testClass构造函数和成员方法report已成功定义/分配。
  2. 由于testMethod定义后缺少分号,因此围绕以下自调用函数的()成为调用运算符,导致我们认为是我们的定义 testMethod成为立即调用的匿名函数,以下匿名函数的返回值成为其参数列表。这解释了打印输出的顺序 - 我们的自调用函数首先运行,因为它被评估为参数。
  3. 由于我们的预期函数定义返回2,因此将此2分配给testMethod函数定义。我们打印testMethod的类型和值确认了这一点。
  4. 现在testClass已成功实例化为testOb,其report方法按预期工作,证明类定义完好无损。
  5. 当我们试着打电话给testMethod时,翻译告诉我们这不是一个功能 - 这是正确的,因为它是一个值为2的数字。
  6. 如果我们在testMethod的定义之后加上一个分号,它将把它的赋值与调用自调用函数分开,我们将得到我们预期的结果:

      

    “运行自调用功能
    实例化testClass
      我是Bill用参数值4“

    运行testMethod



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

    ;(function() {...
    

    但我建议由于问题是由于赋值语句末尾缺少分号,我们应该养成在以这种方式定义函数后总是加分号的习惯。即上面的所有函数在结束括号后应该有一个分号,因为它们都是匿名函数的赋值。

答案 5 :(得分:2)

在Javascript函数中返回函数后,你也应该在大括号之后使用分号。

function watchOut(problem) {
  return function(number, location) { 
    alert("Be careful! There are " + problem +
          " today!\n" +

          number + " have been spotted at the " + location + "!"
    );
  };
}

答案 6 :(得分:0)

分号位于不以大括号结尾的行的末尾或分隔同一行的语句。在闭合支撑后使用它们,或者穿吊带和腰带都没有坏处,但看起来确实有些讨厌。

答案 7 :(得分:0)

我知道这个帖子已经过时但无法抗拒分享这段代码:

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