2011-11-13 78 views
7

我想知道,這是合法嗎?JavaScript語句中必須使用分號嗎?

function test() 
{ 
    alert ("hello") 
    $("#loading").show(); 
} 

或者我應該寫這個:

function test() 
{ 
    alert ("hello"); 
    $("#loading").show(); 
} 

是分號可選在JavaScript?因爲我在論壇上看到了這個:

不,在JavaScript中使用分號通常是可選的(谷歌for ASI /自動分號插入)。使用它們會使代碼看起來更清晰,而ASI是一個可怕的錯誤功能(至少在我看來)。

+1

見:http://stackoverflow.com/questions/7219541/what-is-the-difference-between-semicolons-in-javascript-and-in-python/7219549#7219549等答案,問題 – NullUserException

+1

你的兩條陳述都有分號 - 兩者都不相同。 – Nightfirecat

+0

@Nightfirecat - 他們原本沒有,看起來像NullUserException的編輯把分號放回來。編輯:但是,然後再次刪除它! –

回答

12

分號並不總是強制性的,但我總是建議使用它們。見ECMAScript spec關於自動分號插入規則:

某些ECMAScript的語句(空語句,變量聲明, 表達式語句,do-while語句,continue語句,打破 語句,return語句,和throw語句)必須用分號終止 。這些分號可能會始終顯示在 源文本中。但是,爲了方便起見,在某些情況下,可能會從源文本中省略這些分號( )。這些情況是 ,通過說分號在這些情況下自動插入到源代碼令牌流 中。

更新(進一步說明)

也許是用來說明爲什麼自動插入分號可不好,最常見的情況是,在另一個答案觸及的@sissonb。考慮以下幾點:

function something(a, b) { 
    return 
    a + b; 
} 

你可能被期望是新行被忽略,並解釋爲代碼:

function something(a, b) { 
    return a + b; 
} 

不幸的是,自動分號插入進場時,和代碼實際上這樣解釋:

function something(a, b) { 
    return; 
    a + b; 
} 

和空return表態意味着該函數返回undefined。因此,您可以獲得undefined而不是兩個參數的總和,並且可能最終對您出錯的位置感到困惑!這就是爲什麼我完全同意你的問題中的陳述,即自動分號插入是一個可怕的錯誤。

+0

一個明智的例外是單線回調:'ar.sort(function(a,b){return f(a) - f(b)})' –

0

分號不是強制性的。如果它們丟失,它們會自動添加到行尾,這實際上會導致此代碼返回未定義狀態。

return 
{ 
    text:"hello" 
} 
+1

It實際上返回'undefined',這與'null'不太一樣。 – NullUserException

+0

@NullUserExceptionఠ_ఠ更新我的答案。謝謝 – sissonb

相關問題