J'ai regardé CoffeeScript et je ne comprends pas comment vous écririez du code comme celui-ci. Comment gère-t-il les fonctions anonymes imbriquées dans sa syntaxe?
;(function($) {
var app = $.sammy(function() {
this.get('#/', function() {
$('#main').text('');
});
this.get('#/test', function() {
$('#main').text('Hello World');
});
});
$(function() {
app.run()
});
})(jQuery);
n'a pas réellement compilé, mais cela devrait fonctionner
(($) ->
app = $.sammy ->
this.get '#/', ->
$('#main').text ''
this.get '#/test', ->
$('#main').text 'Hello World'
$(->
app.run()
)
)(jQuery);
La réponse de Matt est correcte, mais voici une méthode alternative:
Dans CoffeeScript 1.0 (publié quelques semaines après la pose de cette question), un opérateur do
a été introduit qui exécute la fonction qui la suit immédiatement. Il est principalement utilisé pour capturer des variables dans des boucles, car
for x in arr
do (x) ->
setTimeout (-> console.log x), 50
(qui transmet une référence à x
dans la fonction anonyme) se comporte différemment de
for x in arr
setTimeout (-> console.log x), 50
Ce dernier affichera simplement la dernière entrée dans arr
à plusieurs reprises, car il n'y a qu'une seule x
.
Quoi qu'il en soit, vous devez savoir que do
est un moyen d'exécuter une fonction anonyme sans les parenthèses supplémentaires, bien que ses capacités en ce qui concerne le passage d'arguments soient un peu limitées pour le moment. J'ai soulevé une proposition pour les élargir .
Actuellement, l'équivalent de votre exemple de code serait
do ->
$ = jQuery
...
Si ma proposition est acceptée, il sera possible d'écrire
do ($ = jQuery) ->
...
au lieu.
Variante courte
do ($=jQuery)->
app = $.sammy ->
@get '#/', -> $("#main").text ''
@get '#/test', -> $('#main').text 'Hello world'
$ -> app.run()