簡體   English   中英

什么時候應該在花括號后使用分號?

[英]When should I use a semicolon after curly braces?

我多次看到在函數聲明之后或模塊模式腳本的匿名“返回”函數之后使用分號。 什么時候在花括號后使用分號合適?

在語句后使用分號。 這是一個聲明:

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

因為它是一個變量賦值(即創建一個匿名函數並將其賦值給一個變量)。

兩個不是語句的東西是函數聲明:

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

和塊:

 { alert("foo"); }

注意:沒有分號的相同塊結構也適用於fordowhile循環。

當您打算縮小代碼時,這也很重要。

所以我個人在每個}之后添加一個,其中自動分號插入(ASI) 會插入一個。

我寫了一篇關於JavaScript 中的 ASI的文章。

不要使用分號:

...如果這只是您的日常函數聲明:

function foo() {

} // No semicolon


使用分號:

...如果這是一項任務:

var foo = function() {

}; // Semicolon


...或自調用函數:

(function () {

})(); // Semicolon

你永遠不需要; 你總是可以(除了之前elsewhile )。

解釋:

不幸的是,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被分配的不是我們的函數定義,而是函數定義的返回值。 並且函數定義本身是匿名運行的。 這是如何:

  1. testClass構造函數和成員方法report成功定義/分配。
  2. 因為testMethod定義后沒有分號,所以后面的自調用函數的()變成了一個調用操作符,導致我們認為是我們定義的testMethod變成了一個立即調用的匿名函數,而以下匿名函數的返回值成為其參數列表。 這解釋了打印輸出的順序 - 我們的自調用函數首先運行,因為它被評估為參數。
  3. 由於我們預期的函數定義返回 2,因此分配給testMethod是這個 2,而不是函數定義。 我們打印的testMethod的類型和值證實了這一點。
  4. 現在testClass成功實例化為testOb並且它的report方法按預期工作,證明類定義在其他方面是完整的。
  5. 當我們嘗試調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM