web-dev-qa-db-fra.com

Syntaxe des fonctions anonymes dans CoffeeScript

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

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);
44
Matt Briggs

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.

35
Trevor Burnham

Variante courte

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