我几次遇到过这种结构。
示例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
答案 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)
)是表达式。