Coffeescript —自己開始型の匿名関数を作成する方法は?


回答:


160

かっこを使用することもできますが(たとえば(-> foo)()、次のdoキーワードを使用してかっこを避けることができます)。

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

の最も一般的な使用法はdo、ループ内の変数をキャプチャすることです。例えば、

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

がないとdoxループ後の値を3回出力することになります。


24
次のように書くこともできますf = do -> console.log x
scribu 2011

5
@scribuええと、これら2つのステートメントは非常に異なり、実際にはあなたのステートメントが私が与えるべきものです。鉱山は関数-> console.log 'this runs right away'fに割り当ててから実行します。yoursは関数を実行fし、元の質問と同様に、その結果をに割り当てます。(ただし、の場合console.log、戻り値は常にundefinedです。)
Trevor Burnham

1
丁度。また、あなたは、オブジェクトのプロパティをこのように定義することができます{f: do -> // something}
scribu

2
CoffeeScript 1.3.1(2012年4月リリース)以降do、関数に引数を渡すこともできます。合格する1と、2パラメータなどxy、書き込みdo (x = 1, y = 2) ->。(この機能のドキュメントは失われました、この機能が導入された問題にはいくつかの例があります。)
Rory O'Kane 2013

19

CoffeeScriptの自己呼び出し関数に渡された引数を「エイリアス」したい場合、これが達成しようとしていることだとしましょう。

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

その後do (window, document) ->、あなたにそれをさせません。行く方法は、その後、parensを使用することです:

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

5
do (global=window, doc=document) ->
ビリームーン

16

それはコーヒーでばかばかしいほど簡単です:

do ->

戻ります

(function() {})();

5

doキーワードをデフォルトの関数パラメーターと組み合わせて、再帰的な「自己開始関数」に初期値をシードすることもできます。例:

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


3
do ->
    #your stuff here

これにより、自己実行型のクロージャが作成され、スコープ設定に役立ちます。


1
これは、すでに投稿されている他の回答と比較して、多くの新しい情報を追加しているようには見えません。競合する回答を作成するのではなく、別の回答の下に有益なコメントを投稿して、他の回答に明確さや有用な情報を追加することで、より多くの価値を追加できます。
still_dreaming_1 2015

1

申し訳ありませんが、私はそれを解決しました:

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

1
@Squeegy私は必ずしもそうは言わないでしょう。doキーワードは、それが必要な時々 JSスタイルのアプローチを使用するように作るいくつかの制限があります(参照問題960)。doクロージャ付きループのユースケースのために実際に追加されただけです。
トレバーバーナム2011

1
しかし、私たちはCoffeeScriptを使用してそのような顔を殴っていません。
ブランドン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.