Question

I've been looking at CoffeeScript and I'm not understanding how you would write code like this. How does it handle nested anonymous functions in its syntax?

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

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

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

          });

          $(function() {
            app.run()
          });
        })(jQuery);
Was it helpful?

Solution

didn't actually compile it, but this should work

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

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

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

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

OTHER TIPS

Matt's answer is correct, but here's an alternative method:

In CoffeeScript 1.0 (released a few weeks after this question was posed), a do operator was introduced that runs the function that immediately follows it. It's mostly used for capturing variables in loops, since

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

(which passes a reference to x into the anonymous function) behaves differently than

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

The latter will simply output the last entry in arr repeatedly, since there's only one x.

Anyway, you should be aware of do as a way of running an anonymous function without the extra parentheses, though its capabilities with respect to argument-passing are a bit limited at the moment. I've raised a proposal to broaden them.

Currently, the equivalent of your code example would be

do ->
  $ = jQuery
  ...

If my proposal is accepted, it will be possible to write

do ($ = jQuery) ->
  ...

instead.

Short variant

do ($=jQuery)->
 app = $.sammy ->
   @get '#/', -> $("#main").text ''
   @get '#/test', -> $('#main').text 'Hello world'
 $ -> app.run()
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top