31

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);
1
  • 4
    The CoffeeScript website has a Try CoffeeScript feature, which compiles to JavaScript on the fly. I was able to figure out the answer in a few minutes playing around with it. Commented Nov 12, 2010 at 16:13

3 Answers 3

44

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);
Sign up to request clarification or add additional context in comments.

1 Comment

Since coffeescript automatically wraps code in an anonymous function anyway, you can actually just put $ = jQuery at the top of your file and take out the calling of an anonymous function with jQuery as a parameter.
36

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.

1 Comment

This method is really nice, as accounting for coffeescript philosofy it does not require any closing brackets
5

Short variant

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.