0

私はちょうどCoffeescriptから始めて、「CoffeeScriptブックのプログラミング」に示されている例を実行しています。

while ループのセクションで、times 関数の呼び出しを次のように宣言する必要がある理由に興味をそそられました。

times = (number_of_times, callback) ->
    index = 0
    while index++ < number_of_times
        callback(index)
    return null

times 5, (index) ->
    console.log index

私はコードを読むのに少し苦労していました。

times (5, (index)) ->
   console.log index

エラーを返します。このコードを理解するための助けを提供してください。

4

1 に答える 1

1

標準の関数定義は次のように構成されています。

name = (arg, ...) ->
    body

timesですから、あなたの定義について言うことはあまりありません。だから私たちはあなたの呼び出しを見てみましょうtimes

times 5, (index) ->
    console.log index

この部分:

(index) ->
    console.log index

は単なる別の関数定義ですが、これは匿名です。名前付き関数を使用して呼び出しを書き直し、次のことを明確にすることができます。

f = (index) -> console.log index
times 5, f

そして、オプションの括弧を入力して、実際にそれを詳しく説明することができます。

f = (index) -> console.log(index)
times(5, f)

すべてが分解されると、次のように表示され5ます(index)

times 5, (index) ->
   console.log index

互いに関係がないので、括弧でグループ化します。

times (5, (index)) ->
   console.log index

意味がありません。構造を明確にするためにその呼び出しに括弧を追加したい場合times(これはコールバック関数が長い場合に非常に便利です)、2つのことを知っておく必要があります。

  1. 関数名と引数の前後の開き括弧の間にスペースはありません。スペースがある場合、CoffeeScriptは、引数リスト内で物事をグループ化するために括弧を使用していると見なします。
  2. 括弧は引数リスト全体を囲む必要があり、これにはコールバック関数の本体が含まれます。

それを与える、あなたは書くだろう:

times(5, (index) ->
   console.log index
)

多分:

times(5, (index) -> console.log(index))

を使用console.logすると、次のような非ネイティブ関数を使用することもできます。

times(5, console.log)

TypeErrorしかし、それはいくつかのブラウザであなたに与えるでしょう、それでそこまで行かないでください。

于 2013-03-17T17:52:04.510 に答える