2010-11-12 17 views
27

Patrzyłem na CoffeeScript i nie rozumiem, jak napisać kod w ten sposób. W jaki sposób obsługuje zagnieżdżone funkcje anonimowe w swojej składni?Składnia funkcji anonimowych w CoffeeScript

;(function($) { 
      var app = $.sammy(function() { 

      this.get('#/', function() { 
       $('#main').text(''); 
      }); 

      this.get('#/test', function() { 
       $('#main').text('Hello World'); 
      }); 

      }); 

      $(function() { 
      app.run() 
      }); 
     })(jQuery); 
+4

Sieć [strony coffeescript] (http://jashkenas.github.com/coffee-script/) ma * Staraj coffeescript * Funkcja, która kompiluje się do kodu JavaScript w locie. W kilka minut udało mi się znaleźć odpowiedź. –

Odpowiedz

41

faktycznie nie skompilować, ale to powinno działać

(($) -> 
    app = $.sammy -> 

    this.get '#/', -> 
     $('#main').text '' 

    this.get '#/test', -> 
     $('#main').text 'Hello World' 

    $(-> 
    app.run() 
) 
)(jQuery); 
+0

Wielkie dzięki chłopaki – Handloomweaver

+11

Ponieważ coffeescript automatycznie opakowuje kod w anonimową funkcję, tak naprawdę można po prostu umieścić '$ = jQuery' na górze pliku i wyjąć wywołanie anonimowej funkcji z jQuery jako parametrem. –

+2

tak, właśnie robiłem linię dla portu linii jego kodu –

34

odpowiedź Matta jest poprawna, ale tutaj jest alternatywna metoda:

W coffeescript 1.0 (wydana kilka tygodni po tym zadane pytanie), wprowadzono operatora do, który uruchamia funkcję bezpośrednio po nim. Jest to najczęściej używane do przechwytywania zmienne pętle, ponieważ

for x in arr 
    do (x) -> 
    setTimeout (-> console.log x), 50 

(która przechodzi przez odniesienie do x do funkcji anonimowego) zachowuje się inaczej niż

for x in arr 
    setTimeout (-> console.log x), 50 

Ten ostatni po prostu wyjścia ostatniej pozycji w arr wielokrotnie , ponieważ jest tylko jeden x.

W każdym razie powinieneś być świadomy do jako sposobu uruchamiania anonimowej funkcji bez dodatkowych nawiasów, choć jej możliwości w zakresie przekazywania argumentów są w tej chwili nieco ograniczone. Podniosłem numer proposal to broaden them.

Obecnie równowartość swojej przykład kodu byłoby

do -> 
    $ = jQuery 
    ... 

Jeśli moja propozycja zostanie przyjęta, będzie można napisać

do ($ = jQuery) -> 
    ... 

zamiast.

+0

Ta metoda jest naprawdę fajna, jako że rozliczająca dla filozofii coffeescript nie wymaga żadnych nawiasów zamykających –

4

Krótki wariant

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