2011-07-26 44 views
3

可能重複:
Lambda function syntax in JavaScript without curly bracesProtovis - 這些功能沒有大括號是什麼?

與Protovis打交道 - 他們實現這些沒有花括號裏給出一些奇怪的委託功能 - 它可以有人樹蔭輕我,好嗎? 實施例:

vis.add(pv.Label) 
.data(cols) 
.left(function() this.index * w + w/2) 
.top(0) 
.textAngle(-Math.PI/2) 
.textBaseline("middle"); 
+0

你可以在鏈接的問題中找到更多信息,但是對智者來說一句話:不要這麼做!遲早你會遇到這個(漂亮)語法的麻煩。如果我沒有弄錯,它也不會通過JSLint。使用coffeescript,如果你想寫「漂亮」的Javascript代替 – polarblau

回答

6

一般而言,如在question @missingno linked to解釋的,這是用於聲明函數,通過火狐主要支持的替代語法。相反的:

function() { return "stuff" }; 

你省略花括號和return聲明:

function() "stuff"; 

功能的結束時發生的任何地方,正常的語句可能會結束 - 分號(;),逗號(, )或左括號())。

在Protovis中,有很多情況下需要聲明簡短的單語句匿名函數作爲參數傳入方法調用。這是一種常見模式,該庫包含一個解析實用程序,以確保上述語法在Firefox以外的瀏覽器中受支持。如果你喜歡這個腳本標記附上Protovis代碼:

<script type="text/javascript+protovis"> 
// ... 
</script> 

腳本將由Protovis分析器,它確保了特殊語法的支持進行評估。

這個我的兩分錢:此語法的好處是,它是非常快(加上所有的例子都使用它)。使用Protovis一個典型的劇本涉及匿名函數很多,所以這可以爲您節省一些打字,它看起來相當真棒。當我第一次使用Protovis時,我使用了很多 - 不僅在方法調用中,而且在變量聲明中。

,它有幾個非常沉重的問題:

  • 因爲你所有的代碼通過Protovis解析器,基本上munges代碼重新添加return語句運行,然後eval()它,調試簡單的語法錯誤變得非常困難。你得到所有這些「意外的標識符」指着Protovis代碼eval()行錯誤,沒有指出其中的問題(缺少分號等)在自己的代碼發生的。

  • 如果您希望代碼在Firefox外工作,則必須將所有代碼包含在特殊的javascript+protovis腳本標記中,這意味着無需外部文件。一旦你開始做一些甚至是極其複雜的事情,你真的想保持你的腳本大部分時間分開。

  • 與任何「聰明」的語法,它可以得到真的很難閱讀,特別是當你以意想不到的方式使用它(例如之外的方法調用的)。是的,它很簡潔,但有明確的價格可支付的易讀性。

說了這麼多,我還是用它來快速畫一個草圖。但大多數時候,我會建議堅持正常的腳本標記和標準的,花括號的函數聲明。

+0

非常感謝,現在的事情更有意義:)更多。還發現[this](http://perfectionkills.com/a-closer-look-at-expressi on-closures /)作爲另一個看@這種難以捉摸的語法...... –