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);
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 () .
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With