Coffeescript - Come creare una funzione anonima ad avvio automatico?


Risposte:


160

Anche se puoi semplicemente usare le parentesi (ad esempio (-> foo)(), puoi evitarle usando la doparola chiave:

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

L'utilizzo più comune di doè l'acquisizione di variabili in un ciclo. Per esempio,

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

Senza il do, stamperesti solo il valore di xdopo il ciclo 3 volte.


24
Puoi anche scriveref = do -> console.log x
scribu

5
@scribu Beh, queste due affermazioni sono molto diverse e la tua è in realtà quella che avrei dovuto fornire. Il mio assegna la funzione -> console.log 'this runs right away'a f, quindi la esegue; il tuo esegue la funzione e quindi assegna il risultato a f, come nella domanda originale. (Anche se nel caso di console.log, il valore restituito è sempre undefinedcomunque.)
Trevor Burnham

1
Esattamente. Inoltre, puoi definire le proprietà degli oggetti in questo modo:{f: do -> // something}
scribu

2
A partire da CoffeeScript 1.3.1 (rilasciato nell'aprile 2012), doconsente anche di passare argomenti alla funzione. Per passare 1e 2come i parametri xe y, scrivi do (x = 1, y = 2) ->. (La documentazione per questa funzione è andata persa , ma il problema in cui è stata introdotta la funzione ha alcuni esempi.)
Rory O'Kane

19

Se vuoi "alias" gli argomenti passati alla funzione di auto invocazione in CoffeeScript, e diciamo che questo è ciò che stai cercando di ottenere:

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

Allora do (window, document) ->non te lo lascerò fare. La strada da percorrere è con i genitori quindi:

(( global, doc ) -> 
  # your code here
)( window, document ) 

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

16

è ridicolo facile nel caffè:

do ->

tornerà

(function() {})();

5

È inoltre possibile combinare la doparola chiave con i parametri di funzione predefiniti per eseguire il seeding di "funzioni ad avvio automatico" ricorsive con un valore iniziale. Esempio:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

Questo creerà una chiusura autoeseguente, utile per la definizione dell'ambito.


1
Questo non sembra aggiungere molte nuove informazioni rispetto alle altre risposte già pubblicate. Piuttosto che creare una risposta concorrente, potresti aggiungere più valore pubblicando un commento informativo sotto un'altra risposta che aggiunge chiarezza o informazioni utili all'altra risposta.
still_dreaming_1

1

Mi scuso, l'ho risolto:

f = (
    () -> "something"
)()

1
@Squeegy non lo direi necessariamente. La doparola chiave ha alcune limitazioni che a volte rendono necessario utilizzare l'approccio in stile JS (vedi numero 960 ); doè stato aggiunto solo a causa del caso d'uso loop-with-closures.
Trevor Burnham

1
Ma non stiamo nemmeno usando CoffeeScript per darci un pugno in faccia in quel modo.
Brandon

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.