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.


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 ) 

5
do (global=window, doc=document) ->
Billy Moon


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


3
do ->
    #your stuff here

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


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"
)()

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.