2012-04-26 93 views
0

我是CoffeeScript的新手,我無法理解它的一些語法。理解咖啡腳本語法

例如,在此函數調用:

e('') 
    .color('rgb(255,0,0)') 
    .attr(x: 20, 
      y: 100, 
      w: 10, 
      h: 100) 

我期待這個編譯JS代碼經過連鍵的x,y的對象,W,H到attr方法。但是,這段代碼實際上編譯成這樣:

e('').color('rgb(255,0,0)').attr({ 
    x: 20 
}, { 
    y: 100, 
    w: 10, 
    h: 100 
}); 

它傳遞了兩個對象attr,先用鑰匙x,和第二連鍵yw,和h。我無法理解爲什麼x與其他鍵分開,但其他鍵不能相互分離?

因爲我想通過attr方法一個對象,我嘗試這樣做:

e('') 
    .color('rgb(255,0,0)') 
    .attr({x: 20, 
      y: 100, 
      w: 10, 
      h: 100}) 

但是這給了我在那個y: 100得到地方行編譯錯誤:Error: Parse error on line 4: Unexpected '{'。奇怪的是,第4行中沒有{。我也嘗試刪除attr中的parens,但仍遇到相同的錯誤。

我可以用這個解決它:

e('') 
    .color('rgb(255,0,0)') 
    .attr(
      x: 20, 
      y: 100, 
      w: 10, 
      h: 100) 

如果我刪除換行符.attr(後,然後我得到了相同的代碼在我的第一個例子,這不是我想要的。

現在我想知道我是否誤解了CoffeeScript語法中的某些要點或者其中存在真正奇怪的東西。還是我在CoffeeScript中發現了一個錯誤?有任何想法嗎?

我使用的CoffeeScript 1.3.1

回答

0

明顯的解決辦法是把你的對象在同一行,爲.attr({x: 20, y: 100, w: 10, h: 100})。 (雖然沒有測試過,但我不明白爲什麼它不起作用)。

雖然有時可以不使用括號,但我更喜歡在函數調用中使用它們,因爲我發現它更具可讀性。

+0

當然,這是有效的。我已經有了一個工作代碼,但我想知道爲什麼編譯器會給我的第二個示例提供錯誤,如果我有幾十個元素,那麼我如何傳遞一個對象,因此我必須將其分解爲行。 – sinan 2012-04-26 19:41:58

3

在coffeescript空白是重要的。無論你認爲他們應該走哪條路,你都不能排隊。嘗試是這樣的:

e('') 
    .color('rgb(255,0,0)') 
    .attr(
    x: 20 
    y: 100 
    w: 10 
    h: 100 
) 

編輯:如果你想有X在同一行作爲方法調用你只需要正確地縮進:

e('') 
    .color('rgb(255,0,0)') 
    .attr(x: 20, 
    y: 100, 
    w: 10, 
    h: 100) 
+0

嗯,所以刪除對象文字作品中的逗號。謝謝。我仍然在尋找我的編譯器錯誤的答案,爲什麼在我的第一個例子中只有x與其他鍵分開。 – sinan 2012-04-26 19:49:21

+0

我相信它分離的原因是因爲第一個參數與方法調用放在同一行。換行符讓編譯器假設第二組變量。這種假設適用於具有這種簽名的方法'methodName(param1,param2,objOrCallback)' – Sandro 2012-04-26 19:54:22

+0

x之所以被分開是因爲有明顯的空白。你錯了。 – david 2012-04-26 19:56:27

1

這是你在找什麼:

e('') 
    .color('rgb(255,0,0)') 
    .attr 
    x:20 
    y:100 
    w:10 
    h:100 

其編譯成:

e('').color('rgb(255,0,0)').attr({ 
    x: 20, 
    y: 100, 
    w: 10, 
    h: 100 
}); 

記住,CoffeeScript是關於簡單性和避免大括號和逗號...

+0

除非避免使用大括號和逗號降低可讀性。雖然這裏不是這種情況,但很容易跨越線路並加入黑暗的一面 – ksol 2012-04-27 07:27:07

+0

過度行爲從來不是件好事。我的觀點是CoffeeScript就像'Python for JS'。 – Alladinian 2012-04-27 07:37:50