【问题标题】:How to parse/understand this coffeescript syntax?如何解析/理解这个咖啡脚本语法?
【发布时间】:2015-11-10 07:45:21
【问题描述】:

我遇到过几次这种结构。

示例 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

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    如果我们添加可选的括号,事情可能会更清楚:

    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))是一个表达式。

    【讨论】:

    • 有时我不确定语法中的这种可选性是否值得。感谢您的精彩解释
    • 我几乎一直都包含括号。我厌倦了记忆优先表并试图在精神上解析代码,额外的括号让我更清楚。我在 Ruby 中也这样做,我不在乎它是否在政治上不正确。
    • 我觉得我有点挣扎,因为从概念上讲我不确定何时使用 ':' 以及何时使用 '='。完全同意“政治不正确”的观点。 :-)
    • @AnthonyKong: class 基本上是一个带有一些额外内容的函数来设置继承等。因此,如果您说f = -> ...,那么您实际上是在定义该类的本地变量;如果您说p: ...,那么您正在定义一个属性。我写了更多关于这个over here
    猜你喜欢
    • 2013-06-10
    • 2013-06-25
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多