简体   繁体   中英

Anonymous functions syntax in CoffeeScript

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);

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);

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM