如何解析/理解这个coffeescript语法?

时间:2015-11-09 23:15:06

标签: 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

1 个答案:

答案 0 :(得分: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))是表达式。