Подтвердить что ты не робот

Синтаксис анонимных функций в CoffeeScript

Я смотрел CoffeeScript, и я не понимаю, как вы напишете такой код. Как он обрабатывает вложенные анонимные функции в своем синтаксисе?

;(function($) {
          var app = $.sammy(function() {

            this.get('#/', function() {
              $('#main').text('');
            });

            this.get('#/test', function() {
              $('#main').text('Hello World');
            });

          });

          $(function() {
            app.run()
          });
        })(jQuery);
4b9b3361

Ответ 1

на самом деле не скомпилировал его, но это должно работать

(($) ->
  app = $.sammy ->

    this.get '#/', ->
      $('#main').text '' 

    this.get '#/test', ->
      $('#main').text 'Hello World'

  $(->
    app.run()
  )
)(jQuery);

Ответ 2

Ответ Matt правильный, но здесь альтернативный метод:

В CoffeeScript 1.0 (выпущен через несколько недель после постановки этого вопроса) был введен оператор do, который запускает функцию, которая сразу же следует за ней. Он в основном используется для записи переменных в циклы, поскольку

for x in arr
  do (x) ->
    setTimeout (-> console.log x), 50

(который передает ссылку на x в анонимную функцию) ведет себя иначе, чем

for x in arr
  setTimeout (-> console.log x), 50

Последний будет просто выводить последнюю запись в arr несколько раз, поскольку существует только один x.

В любом случае, вы должны знать do как способ запуска анонимной функции без дополнительных скобок, хотя ее возможности в отношении передачи аргументов в настоящее время немного ограничены. Я поднял предложение чтобы расширить их.

В настоящее время эквивалент вашего примера кода будет

do ->
  $ = jQuery
  ...

Если мое предложение будет принято, можно будет написать

do ($ = jQuery) ->
  ...

вместо.

Ответ 3

Короткий вариант

do ($=jQuery)->
 app = $.sammy ->
   @get '#/', -> $("#main").text ''
   @get '#/test', -> $('#main').text 'Hello world'
 $ -> app.run()