[英]When should I use a semicolon after curly braces?
我多次看到在函數聲明之后或模塊模式腳本的匿名“返回”函數之后使用分號。 什么時候在花括號后使用分號合適?
在語句后使用分號。 這是一個聲明:
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
是這個 2,而不是函數定義。 我們打印的testMethod
的類型和值證實了這一點。testClass
成功實例化為testOb
並且它的report
方法按預期工作,證明類定義在其他方面是完整的。testMethod
,解釋器告訴我們它不是一個函數——這是正確的,因為它是一個值為 2 的數字。 如果我們在testMethod
的定義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()
分號位於不以花括號結尾的行的末尾,或用於分隔同一行上的語句。 在閉合支架之后使用它們,或者穿吊帶和腰帶都沒有壞處,但它看起來確實有點書呆子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.