我应该在花括号后面用分号吗?
很多时候我在函数声明之后,或者在模块模式脚本的匿名“返回”函数之后看到了一个分号。 在大括号之后使用分号适合什么时候使用?
声明后使用分号。 这是一个声明:
var foo = function() { alert("bar"); };
因为它是一个variables赋值(即创build和分配一个匿名函数给variables)。
我们想到的两件事情就是函数声明:
function foo() { alert("bar"); }
并阻止:
{ alert("foo"); }
注意:没有分号的同一个块结构也适用于for
, do
和while
循环。
当你打算缩小你的代码时,这也是很重要的。
所以我个人在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
不是我们的函数定义,而是函数定义的返回值。 而函数定义本身正在匿名运行。 这是如何:
-
testClass
构造函数和成员方法report
已成功定义/分配。 - 由于
testMethod
定义之后缺less分号,围绕以下自我调用函数的()
成为一个调用操作符,这导致我们认为我们定义的testMethod
成为立即调用的匿名函数,而以下匿名函数的返回值成为其参数列表。 这解释了打印输出的顺序 – 我们的自调用函数首先运行,因为它被作为参数进行评估。 - 由于我们预期的函数定义返回2,所以将这2分配给
testMethod
,而不是函数定义。 这通过我们打印testMethod
的types和值来testMethod
。 - 现在
testClass
已成功实例化为testOb
,其report
方法按预期工作,certificate类定义是完整的。 - 当我们尝试调用
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()