2015-11-09 2 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

Я думаю, что я немного борюсь, потому что концептуально я не уверен, когда использовать ':' и когда использовать '='. Полностью согласен с «политически неверным» моментом. :-) –

Смежные вопросы