2013-04-02 57 views
-5

我有以下的javascript代碼JavaScript的分號問題

var foo = function() { 
    var func = function() { 
     var one = 0; 
     if (one === 0) { 
      alert('func'); 
     } 

    } 

    return { 
     func: func 
    }; 
} 

foo = new foo(); 
foo.func(); 

我上面的代碼警報func這是罰款。現在,當我改變對象字面即return {}到以下

return 
{ 
    func: func 
} 

然後,它不返回任何東西。我知道爲什麼JavaScript會在回報結束時添加分號;。因此,請留出這一部分一段時間,讓我們回顧一下我的原始代碼。當我改變if語句下面

if (one === 0) 
{ 
    alert('func'); 
} 

然後它警報func爲什麼?。因爲在這種情況下JavaScript應該在if(one === 0)的末尾添加分號,所以我認爲它應該返回錯誤。

等一下,還有更多。現在讓我們把注意力轉移回頂部的原始代碼。現在,當我改變我的內在功能,下面

var func = function() 
{ 
    //code here 
} 

隨後又執行此代碼罰款和警告func。再次爲什麼?與外部函數一樣。

+0

'return'語句是這種自動分號插入的特例 – Ian

+1

「我知道爲什麼JavaScript會在分支結束時添加分號」。不,它不。語法只是在'return'後接受語句結束。 – kay

+0

我正在看道格拉斯克羅克福德的演示文稿,並提到他在行尾添加了分號,所以最好自己放。這就是我在這裏說的原因。 – 2619

回答

2

不,分號不插入行的每一端。 The rules are much more complex

當,作爲上述程序的從左至右解析,當遇到標記(稱爲 違規令牌)未被任何生產語法的 允許,則分號自動之前插入所述 違規令牌如果一個或多個下列條件爲真:

  1. 有問題的令牌從令牌以前由至少一個LineTerminator分離。

  2. 有問題的令牌是}。

當,作爲上述程序的從左至右解析,令牌的 輸入流的末尾遇到並且分析器不能 分析輸入令牌流作爲一個單一的完整的ECMAScript程序, 那麼在輸入 流的末尾會自動插入分號。當從左向右解析程序時,遇到某種令牌產生的語法爲 ,但 產品是受限產品,令牌將是第一個 令牌,用於終端或非終端立即在受限制產品 (因此這樣的令牌被稱爲受限令牌)內的 註釋「[沒有LineTerminator here]」,並且受限制的令牌與前一令牌分開至少一個線路終止符,然後是分號自動插入 受限令牌之前。但是,對於上述規則,還有一個額外的覆蓋條件 :如果 分號將被解析爲空語句,或者該分號將成爲 的標題中的兩個分號之一,則從不自動插入分號供參考(第12.6.3節)。

ECMAScript的規範給出了這樣的建議:

在ECMAScript程序員產生的實用的建議是:

一個後綴++或 - 操作人員應在同一行上出現的 操作。

返回或拋出語句中的表達式應該從 開始,與返回或拋出令牌相同。

中斷標籤或 continue語句應與break或continue 令牌位於同一行。

但是要記住的真正實用的東西是複雜的,所以自己附加分號,不要求bug。