3

これまで読んだすべての中で、コールバック関数は引数として他の関数に渡されます。

function mycallback(){
    //dosomething
}

function mainfunc(mycallback){
    //do something else
    mycallback();
}

mainfunc(mycallback);

これはあなたが期待するように機能します、素晴らしいです。私の質問は、mainfuncへの引数としてのコールバック関数の受け渡しが必要かどうかです。これを省略した場合のようです:

function mycallback(){
    //dosomething
}

function mainfunc(){
    //do something else
    mycallback();
}

mainfunc();

正常に動作し、最初の例と同じです。しかし、このようにコールバックを使用している人は見当たりません。理由はありますか?私は何が欠けていますか?

4

3 に答える 3

2

技術的には、はい、そのような関数を使用できます。関数をパラメーターとして渡す理由は、何かをパラメーターとして渡す場合と同じ理由です。

mainfunc(eatSevenBurritos);
mainfunc(eatTwoChimichangas);

特定の条件下では、mainfuncを通過するときに7つのブリトーを食べるほうがよいかもしれません。たぶん他の条件の下で、mainfuncを通過している間あなたはむしろ2つのチミチャンガを食べたいでしょう。

常に同じ関数を実行する場合は、可能であれば、先に進んでそこにコーディングしてください。無意味な複雑さを追加する意味はありません。ただし、その動作を変更する必要がある場合は、それをパラメーターとして扱う必要があります。

人々が「ファーストクラス関数」について話すとき、この種の振る舞いは彼らが意味するものです。関数をパラメーターとして扱うことができる。行動は一種のデータだからです。

于 2012-05-25T20:53:56.387 に答える
2

コールバックは、非同期タスクがある場合に最適に使用されます。

mainfunc非同期操作だとしましょう。

  • 最初の例では、特定のコールバックをに渡しましたmainfunc。これにより、呼び出し元は、操作後に実行する関数を柔軟に割り当てることができます。

  • 2番目の例では、コールバックをハードコーディングしました。あらかじめ決められた後処理機能のように、そうする理由がない限り、これは柔軟ではありません。

于 2012-05-25T20:54:07.413 に答える
2

1つの関数ですべてのコールバックを処理する場合は、2番目のアプローチで問題なく機能します。

多くの場合、コールバックを使用するメソッドを呼び出すときは、いつどこから呼び出すかによって、コールバック内で異なるものが必要になります。単一のコールバック関数ですべての異なる状況を処理する代わりに(どの状況であるかを認識している必要があります)、特定の状況ごとに1つのコールバック関数を使用できます。

于 2012-05-25T20:58:09.817 に答える