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 .


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 ) 

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

16

Beim Kaffee ist es lächerlich einfach:

do ->

wird zurückkehren

(function() {})();

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


3
do ->
    #your stuff here

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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.