Coffeescript - Comment créer une fonction anonyme auto-initiée?


Réponses:


160

Bien que vous puissiez simplement utiliser des parenthèses (par exemple (-> foo)(), vous pouvez les éviter en utilisant le domot - clé:

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

L'utilisation la plus courante de doest la capture de variables dans une boucle. Par exemple,

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

Sans le do, vous imprimeriez simplement la valeur de xaprès la boucle 3 fois.


24
Vous pouvez aussi écriref = do -> console.log x
scribu

5
@scribu Eh bien, ces deux déclarations sont très différentes, et la vôtre est en fait celle que j'aurais dû donner. Le mien assigne la fonction -> console.log 'this runs right away'à f, puis l'exécute; le vôtre exécute la fonction puis affecte son résultat à f, comme dans la question d'origine. (Bien que dans le cas de console.log, la valeur de retour est toujours de undefinedtoute façon.)
Trevor Burnham

1
Exactement. En outre, vous pouvez définir les propriétés des objets de cette façon:{f: do -> // something}
scribu

2
Depuis CoffeeScript 1.3.1 (publié en avril 2012), dovous permet également de passer des arguments à la fonction. Pour passer 1et 2comme paramètres xet y, écrivez do (x = 1, y = 2) ->. (La documentation de cette fonctionnalité s'est perdue , mais le problème où la fonctionnalité a été introduite a quelques exemples.)
Rory O'Kane

19

Si vous voulez "aliaser" les arguments passés à la fonction auto-appelante dans CoffeeScript, et disons que c'est ce que vous essayez de réaliser:

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

Alors do (window, document) ->ne vous laissera pas faire ça. La voie à suivre est alors avec les parents:

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

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

16

c'est ridicule facile dans le café:

do ->

reviendra

(function() {})();

5

Vous pouvez également combiner le domot - clé avec des paramètres de fonction par défaut pour amorcer des «fonctions auto-initiées» récursives avec une valeur initiale. Exemple:

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


3
do ->
    #your stuff here

Cela créera une fermeture auto-exécutable, ce qui est utile pour la portée.


1
Cela ne semble pas ajouter beaucoup de nouvelles informations par rapport aux autres réponses déjà publiées. Plutôt que de créer une réponse concurrente, vous pouvez ajouter plus de valeur en publiant un commentaire informatif sous une autre réponse qui ajoute de la clarté ou des informations utiles à l'autre réponse.
still_dreaming_1

1

Toutes mes excuses, je l'ai résolu:

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

1
@Squeegy Je ne dirais pas nécessairement ça. Le domot-clé a certaines limitations qui rendent parfois nécessaire l'utilisation de l'approche de style JS (voir numéro 960 ); don'a été vraiment ajouté qu'à cause du cas d'utilisation de la boucle avec fermetures.
Trevor Burnham

1
Mais nous n'utilisons pas non plus CoffeeScript pour nous frapper au visage comme ça.
Brandon

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.