Coffeescript - Jak stworzyć samoczynną anonimową funkcję?

Odpowiedzi:

160

Chociaż możesz po prostu użyć nawiasów (np. (-> foo)()Możesz ich uniknąć, używając dosłowa kluczowego:

do f = -> console.log 'this runs right away'

Najczęstszym zastosowaniem dojest przechwytywanie zmiennych w pętli. Na przykład,

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

Bez tego dopo prostu wypisałbyś wartość xpo pętli 3 razy.

Trevor Burnham
źródło
24
Możesz także napisaćf = do -> console.log x
scribu
5
@scribu Cóż, te dwa stwierdzenia są bardzo różne, a twoje jest właściwie tym, które powinienem był podać. Kopalnia przypisuje funkcję -> console.log 'this runs right away'do f, a następnie uruchamia go; yours uruchamia funkcję, a następnie przypisuje jej wynik f, tak jak w oryginalnym pytaniu. (Chociaż w przypadku console.logwartości zwracanej jest zawsze undefined.)
Trevor Burnham,
1
Dokładnie. Możesz także zdefiniować właściwości obiektu w ten sposób:{f: do -> // something}
scribu
2
Począwszy od CoffeeScript 1.3.1 (wydanego w kwietniu 2012 r.), doUmożliwia także przekazywanie argumentów do funkcji. Aby przekazać 1i 2jako parametry xi y, napisz do (x = 1, y = 2) ->. (Dokumentacja dotycząca tej funkcji zaginęła , ale problem związany z wprowadzeniem funkcji ma kilka przykładów).
Rory O'Kane
19

Jeśli chcesz „aliasować” argumenty przekazywane do funkcji samowywołującej się w CoffeeScript, powiedzmy, że to właśnie próbujesz osiągnąć:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

Więc do (window, document) ->nie pozwolę ci tego zrobić. Droga do zrobienia to parens:

(( global, doc ) -> 
  # your code here
)( window, document ) 
Misha Reyzlin
źródło
5
do (global=window, doc=document) ->
Billy Moon
16

w kawie jest śmiesznie łatwo:

do ->

wróci

(function() {})();
mart7ini
źródło
5

Można również połączyć dosłowo kluczowe z domyślnymi parametrami funkcji, aby zapoczątkować rekurencyjne „funkcje samoczynne” z wartością początkową. Przykład:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000
XåpplI'-I0llwlg'I -
źródło
5

Spróbuj użyć

do ($ = jQuery) ->
Pavel Blagodov
źródło
3
do ->
    #your stuff here

Stworzy to samowykonujące się zamknięcie, które jest przydatne do określania zakresu.

Jordan Checkman
źródło
1
Wydaje się, że nie dodaje to wielu nowych informacji w porównaniu z innymi już opublikowanymi odpowiedziami. Zamiast tworzyć konkurencyjną odpowiedź, możesz dodać więcej wartości, zamieszczając pouczający komentarz pod inną odpowiedzią, który dodaje jasności lub przydatnych informacji do drugiej odpowiedzi.
still_dreaming_1
1

Przepraszam, rozwiązałem to:

f = (
    () -> "something"
)()
user537339
źródło
1
@Squeegy Nie powiedziałbym tego koniecznie. Słowo dokluczowe ma pewne ograniczenia, które powodują, że czasami konieczne jest użycie podejścia w stylu JS (patrz wydanie 960 ); dozostał dodany tylko ze względu na przypadek użycia pętli z zamknięciami.
Trevor Burnham
1
Ale my też nie używamy CoffeeScript, żeby uderzyć się w twarz w ten sposób.
Brandon
0

Powinno być

f = () ->
  # do something
Alongkorn Chetasumon
źródło