2015-11-09 32 views
0

我幾次遇到這個構造。如何解析/理解這個coffeescript語法?

例1:

_ = require 'underscore' 

class Controller extends App 

    _doSomething: _.throttle (event) -> 
    $div = $(event.target).closest 'div' 
    ... 

我的問題:

我很難理解爲什麼這個結構是有效的。

通常一類函數的定義是這樣:

_doSomething: (event) -> 
    $div = $(event.target).closest 'div' 
    ... 
    , 500 

那麼,怎樣才能_.throttle坐在:(event)功能參數之間?

如果_.throttle應該充當包裝,應該不是被寫成

_doSomething = _.throttle((event) -> # an anonymous function that takes event as parameter 
    $div = $(event.target).closest 'div' 
    ... 
    , 500 

回答

2
如果加上可選圓括號

事情可能會更清楚:

class Controller extends App 
    _doSomething: _.throttle((event) -> 
    $div = $(event.target).closest 'div' 
    ... 
) 

現在我們看到, _.throttle是函數調用,它被賦予一個匿名函數作爲其單個參數。我們可以打破它多一點,進一步明確這是怎麼回事:

f = (event) -> 
    $div = $(event.target).closest('div') 
    ... 
throttled_function = _.throttle(f) 

class Controller extends App 
    _doSomething: throttled_function 

_.throttle返回,使代碼的功能,你正在尋找纔剛剛一個複雜的版本:

class Controller extends App 
    _doSomething: some_function 

這是沒什麼特別的。請記住,在構建類的方法時可以使用匿名函數,但命名函數或其他表達式對函數進行求值也同樣適用;語法是真的:

name: expr 

其中expr是一些表達和f(x)(或_.throttle(some_anonymous_function))是一個表達式。

+1

有時我不確定語法中的這種選擇性是否值得。感謝您的一個很好的解釋 –

+1

我幾乎包括所有的括號。我厭倦了記憶優先表並試圖在腦海中解析代碼,額外的括號使我對事情更加清楚。我在Ruby中也是這樣做的,我不在乎它在政治上是否正確。 –

+0

我覺得我有點掙扎,因爲在概念上我不確定何時使用':'以及何時使用'='。完全同意「政治上不正確」的觀點。 :-) –