2012-09-02 60 views
12

直到最近我才意識到它,但是在編寫javascript代碼時我使用了Allman style。根據http://encosia.com/in-javascript-curly-brace-placement-matters-an-example/我應該使用K&R style。這是因爲在某些情況下,在下一行放置大括號會導致問題。 對我來說,問題在於我已經長大了喜歡阿爾曼風格,寧願不改變。在編寫javascript時,是否應該使用K&R樣式?

所以,我的問題(一個或多個)

  • 這是真的,奧爾曼風格可能導致錯誤由於 放置在javascript大括號?如何jQuery的?

  • 是否有任何技巧可以讓我使用Allman風格 沒有問題,因爲大括號?

  • 使用這些樣式還有其他問題嗎?

+3

我想這取決於你多久返回對象文字 –

+0

我看不到任何可能出現的問題,除了可讀性。但是K&R似乎對我更有意義,因爲我經常在函數調用中聲明函數和/或對象(例如'setTimeout(1000,function(){complex_functions_content});' 複雜函數的內容將在新行和括號(括號和圓括號)在最後一行,在與setTimeout函數調用相同的縮進級別。 用Allman風格編寫這樣的代碼看起來很奇怪恕我直言。 – Mark

+0

這是可怕的.. –

回答

8

這是真的,奧爾曼風格可能會導致錯誤是由於JavaScript的大括號的位置 ?

是的。正如你的鏈接所解釋的那樣,return後跟一個換行符的語句會混淆解析器,因爲它試圖插入分號。不過,這種行爲並不侷限於返回對象文字。以下功能:

function foo() 
{ 
    return 
     "bar"; 
} 

還將返回undefined

jquery怎麼樣?

無論是否包含jQuery,情況仍然完全相同。

是否有任何竅門可以讓我使用Allman風格而沒有 由於大括號的問題?

是,不要使用奧爾曼風格對象文本。考慮你想將一個對象文字賦值給一個變量。你真的打算寫:

var foo = 
{ 
    bar: "quux" 
}; 

或者你會去:

var foo = { 
    bar: "quux" 
}; 

恕我直言,第二個片段是比第一更易讀。您可以繼續使用奧爾曼風格與括號內forifwhilefunction等,但破例爲對象文本。

是否有使用這些風格相關的任何其他問題?

return是一個非常特殊的情況,因爲它有效或無參數。當在一行中遇到單獨的return語句時,解析器無法確定是否應添加分號來使單行語句有效,或者繼續執行下一行並希望獲得最佳結果。

因此,我認爲這種行爲只會成爲returnthrow的問題,而不是其他語句。

+0

此行爲符合規範,並且[成爲問題*不僅與* return一起使用](http://stackoverflow.com/a/12234451/1081234) –

+1

@ov,實際上,「continue」和「break」採取可選標識符,而不是對象字面量。 '做...而''只會在'while'評估一個對象字面量時造成問題,這實際上是一種非常複雜的實現無限循環的方式。不過,即使拋出對象字面量在我的經驗中也很少見,那麼你在「throw」這一點上的觀點仍然存在。 –

+1

我並沒有真正關注OP的具體情景,而是用括號括起來,而不是在一般的那些陳述之後不能斷行(即沒有'continue'''' [label]',呃),但是一個人能夠經常斷行他們希望在條件等之後。 –

2

記住ECMAScript specification regarding automatic semicolon insertion

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

我笑上面,這是「方便」的建議...

雖然你可以在技術上可以繼續使用上面沒有覆蓋的情況下奧爾曼的格式,我會宣講的一致性。就我個人而言,我是Google JS styleguide的粉絲 - 與您的問題相關的部分是code formattingsemicolons。列出的例子值得檢查。

相關問題