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.

Trevor Burnham
la source
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 ) 
Misha Reyzlin
la source
5
do (global=window, doc=document) ->
Billy Moon
16

c'est ridicule facile dans le café:

do ->

reviendra

(function() {})();
mart7ini
la source
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
XåpplI'-I0llwlg'I -
la source
5

Essayez d'utiliser

do ($ = jQuery) ->
Pavel Blagodov
la source
3
do ->
    #your stuff here

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

Jordan Checkman
la source
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"
)()
user537339
la source
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
0

Ça devrait être

f = () ->
  # do something
Alongkorn Chetasumon
la source