関数をパラメータとして別の関数に渡します。この関数はいわゆるコールバック関数
です。プロジェクトの A 層と B 層が異なる人によって完成される状況によく遭遇します。A 層は関数 funA を担当し、B 層は関数 funcB を担当します。レイヤ B が特定のモジュールからのデータを使用したいとき、彼はレイヤ A の人々に、「特定のニーズを満たすデータを提供してください、そしてあなたは私にインターフェースを提供してください」と言います。
レベル A の担当者は、「データは私が提供します。それをどのように表示して処理するかは B の仕事です」と言いました。
もちろん、レイヤー B は、すべてのニーズに対応するデータ インターフェイスを提供することはできません。B は、B がデータを取得するためのインターフェイスを提供し、それを表示する関数を作成します。
つまり、他の人々と協力する必要があり、他の人々がデータを提供し、他の人々がどのようにデータを取得または構築するかに注意を払う必要はありません。取得したデータを操作するだけです。このとき、コールバック関数
を使用する必要があります。したがって、コールバックは本質的に設計パターンであり、jQuery (他のフレームワークを含む) の設計原則はこのパターンに従います。
同期 (ブロッキング) でのコールバックの使用例。目的は、func1 コードの実行が完了した後に func2 を実行することです。
関数1(関数2);
var func2=function(){
}
非同期コールバックの例:
$.ajax({
URL: "test.html",
コンテキスト: document.body
}).done(function() {
$(this).addClass("done");
}).fail(function() {
アラート("エラー");
}).always(function() {
アラート("完了");
});
http://www.phpv.net/html/1700.html
コールバックはいつ実行されますか?
コールバック関数は通常、同期状況では最後に実行されますが、非同期状況ではイベントがトリガーされなかったり、条件が満たされなかったりするため、実行されない場合があります。
コールバック関数の使用場面
リソースのロード: js ファイルを動的にロードした後にコールバックを実行、iframe をロードした後にコールバックを実行、Ajax 操作のコールバック、画像のロード完了後にコールバックを実行、AJAX など。
DOM イベントと Node.js イベントはコールバック メカニズムに基づいています (Node.js コールバックには、マルチレイヤー コールバックのネストの問題が発生する可能性があります)。
setTimeout の遅延時間は 0 です。このハックはよく使用されます。settimeout によって呼び出される関数は、実際にはコールバック
の具体化です。
連鎖呼び出し: 連鎖すると、setter メソッド (または値自体を返さないメソッド) で連鎖呼び出しを実装するのは簡単ですが、getter メソッドの呼び出しで連鎖呼び出しを実装するのは比較的困難です。このポインターの代わりに必要なデータを返す値を指定します。チェーン メソッドを実装したい場合は、コールバック関数を使用してそれを実現できます
setTimeout および setInterval の関数呼び出しは、戻り値を取得します。どちらの関数も非同期であるため、つまり、呼び出しシーケンスがプログラムのメインプロセスから比較的独立しているため、本体内で戻り値を待つ方法がなく、戻り値が返されたときにプログラムが停止したり待機したりすることはありません。そうしないと setTimeout と setInterval の意味が失われるため、return を使用する意味はなく、callback のみを使用できます。コールバックの意味は、タイムリーな処理のためにタイマーの実行結果をエージェント関数に通知することです。
コールバックが存在し、関数参照または関数式であることを確認することが最善です:
(コールバック && typeof(callback) === "関数") && callback();
用事があるとき、隣の寮にクラスメートを探しに行きましたが、クラスメートがいないことに気づきました。どうしたらよいでしょうか。
方法 1、数分ごとに隣の寮に行き、誰かがいるかどうかを確認します
方法2、彼と同じ寮の人たちに、彼が帰ってくるのを見かけたら電話してもらうようお願いしてください
前者はポーリングであり、後者はコールバックです。
それでは教えてください、クラスメートが戻ってくるまで隣の寮で待っていてもいいですか?
はい、他のことをする時間を節約できたかもしれませんが、今度は待つことで時間を無駄にしなければなりません。元の非ブロッキング非同期呼び出しをブロッキング同期呼び出しに変更します。
JavaScript コールバックは非同期呼び出しシナリオで使用され、コールバックを使用した場合のパフォーマンスはポーリングよりも優れています。
より簡単:
「今出発します。到着したらお知らせします。」