基本形
引数なしの場合
呼び出し元でコールバック関数を引数として、それが実行されるよう実装。
呼び出されるコールバック関数を定義し、その関数名を呼び出し元に引数として渡す。
1 2 3 4 5 6 7 8 9 10 |
caller = (callee) -> callee() callback = -> console.log("Callback called") caller(callback) # 実行結果 # Callback called |
引数ありの場合
コールバックが引数を取る場合、呼び出し元でコールバック関数と引数を受け取るよう実装。
コールバック関数を実装し、その関数名を引数とともに呼び出し元に渡す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
caller = (callee, a, b) -> callee(a, b) add = (x, y) -> x + y mul = (x, y) -> x * y console.log caller(add, 2, 3) console.log caller(mul, 2, 3) # 実行結果 # 5 # 6 |
無名関数を使う方法
“無名関数の記法について”も参照。
引数なしの場合
コールバック関数を新たに定義せず、無名関数として定義して呼び出し元に渡す方法。
無名関数は、関数名を省略していきなり”->”で始める。
1 2 3 4 5 6 7 8 9 10 |
caller = (callback) -> console.log("Calling callback") callback(); caller -> console.log("Callback called") # 実行結果 # Calling callback # Callback called |
引数ありの場合
引数がある場合、関数名を省略して”(引数) ->”で始める。
このとき、無名コールバック関数全体を”()”で囲わないと、”unexpexted ,”(予想外のcomma)エラーになるので注意。
1 2 3 4 5 6 7 8 9 10 |
caller = (callback, x) -> console.log("Calling callback") callback(x) caller(((x) -> console.log("Callback called: #{x * 2}")), 3) # 実行結果 # Calling callback # Callback called: 6 # 無名関数全体を()で囲わないと"error: unexpected ,"になる |
改行可能
複数行にわたる無名関数を引数として渡すとき、()内で改行して渡せる
1 2 3 4 5 6 7 8 9 10 11 12 |
caller = (callback) -> console.log("Calling callback") callback() caller -> console.log("Callback called") console.log("Multiline is OK") # 実行結果 # Calling callback # Callback called # Multiline |
より複雑な内容の関数もok。ただし無名関数が引数を持つ時には()で括らないといけない
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
caller = (callback, x) -> console.log("Calling callback") callback() caller(((x) -> if x % 2 == 0 console.log("even") else console.log("odd") ), 5) # 実行結果 # Calling callback # odd |
即時関数のdoはエラー
引数にコールバックを渡すときにdoを付けてしまうと、その場で実行された上で、「関数ではない」とエラーになる。
1 2 3 4 5 6 7 8 9 10 |
caller = (callback) -> console.log("Calling callback") callback(); caller(do -> console.log("Callback called")) # 実行結果 # Callback called # Calling callback # TypeError: callback is not a function |