Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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); 
like image 921
Handloomweaver Avatar asked Nov 12 '10 15:11

Handloomweaver


People also ask

What is the syntax for an anonymous function?

The () makes the anonymous function an expression that returns a function object. An anonymous function is not accessible after its initial creation. Therefore, you often need to assign it to a variable. In this example, the anonymous function has no name between the function keyword and parentheses () .

How do you write a function in CoffeeScript?

To define a function here, we have to use a thin arrow (->). Behind the scenes, the CoffeeScript compiler converts the arrow in to the function definition in JavaScript as shown below. (function() {}); It is not mandatory to use the return keyword in CoffeeScript.

What is anonymous function explain with example?

In Python, an anonymous function is a function that is defined without a name. While normal functions are defined using the def keyword in Python, anonymous functions are defined using the lambda keyword. Hence, anonymous functions are also called lambda functions.

What is an anonymous function expression in JavaScript?

In JavaScript, an anonymous function is that type of function that has no name or we can say which is without any name. When we create an anonymous function, it is declared without any identifier. It is the difference between a normal function and an anonymous function.


2 Answers

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); 
like image 138
Matt Briggs Avatar answered Sep 27 '22 22:09

Matt Briggs


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.

like image 29
Trevor Burnham Avatar answered Sep 27 '22 21:09

Trevor Burnham