Coffeescript - Wie erstelle ich eine selbstinitiierende anonyme Funktion?

Antworten:

160

Sie können zwar nur Klammern verwenden (z. B. (-> foo)()können Sie diese mithilfe des doSchlüsselworts vermeiden :

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

Die häufigste Verwendung doist das Erfassen von Variablen in einer Schleife. Zum Beispiel,

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

Ohne das würden doSie nur xdreimal den Wert von nach der Schleife drucken .

Trevor Burnham
quelle
24
Sie können auch schreibenf = do -> console.log x
scribu
5
@scribu Nun, diese beiden Aussagen sind sehr unterschiedlich, und deine ist eigentlich die, die ich hätte geben sollen. Meins weist die Funktion -> console.log 'this runs right away'zu fund führt sie dann aus. Ihr führt die Funktion aus und weist ihr Ergebnis dann fwie in der ursprünglichen Frage zu. (Im Fall von console.logist der Rückgabewert jedoch immer undefined.)
Trevor Burnham
1
Genau. Sie können Objekteigenschaften auch folgendermaßen definieren:{f: do -> // something}
Scribu
2
Ab CoffeeScript 1.3.1 (veröffentlicht im April 2012) dokönnen Sie auch Argumente an die Funktion übergeben. Um 1und 2als Parameter xund zu übergeben y, schreiben Sie do (x = 1, y = 2) ->. (Die Dokumentation für diese Funktion ist verloren gegangen , aber das Problem, bei dem die Funktion eingeführt wurde, enthält einige Beispiele.)
Rory O'Kane
19

Wenn Sie die Argumente, die an die selbstaufrufende Funktion in CoffeeScript übergeben werden, "aliasen" möchten, und sagen wir, dies ist das, was Sie erreichen möchten:

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

Dann do (window, document) ->lass dich das nicht tun. Der Weg ist dann mit den Eltern:

(( global, doc ) -> 
  # your code here
)( window, document ) 
Mischa Reyzlin
quelle
5
do (global=window, doc=document) ->
Billy Moon
16

Beim Kaffee ist es lächerlich einfach:

do ->

wird zurückkehren

(function() {})();
mart7ini
quelle
5

Sie können das doSchlüsselwort auch mit Standardfunktionsparametern kombinieren, um rekursive "selbstinitiierende Funktionen" mit einem Anfangswert zu setzen. Beispiel:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000
XåpplI'-I0llwlg'I -
quelle
5

versuchen zu benutzen

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

Dadurch wird ein selbstausführender Abschluss erstellt, der für das Scoping nützlich ist.

Jordan Checkman
quelle
1
Dies scheint im Vergleich zu den anderen bereits veröffentlichten Antworten nicht viele neue Informationen hinzuzufügen. Anstatt eine konkurrierende Antwort zu erstellen, können Sie einen Mehrwert schaffen, indem Sie einen informativen Kommentar unter einer anderen Antwort veröffentlichen, die der anderen Antwort Klarheit oder nützliche Informationen verleiht.
still_dreaming_1
1

Entschuldigung, ich habe es gelöst:

f = (
    () -> "something"
)()
user537339
quelle
1
@Squeegy Das würde ich nicht unbedingt sagen. Das doSchlüsselwort weist einige Einschränkungen auf, die es manchmal erforderlich machen, den JS-Ansatz zu verwenden (siehe Problem 960 ). dowurde wirklich nur wegen des Anwendungsfalls "Loop-with-Closures" hinzugefügt.
Trevor Burnham
1
Aber wir verwenden CoffeeScript auch nicht, um uns so ins Gesicht zu schlagen.
Brandon
0

Es sollte sein

f = () ->
  # do something
Alongkorn Chetasumon
quelle