パラメーターとして関数を別の関数に渡します。この関数は、コールバック関数と呼ばれます
この状況では、プロジェクトのAおよびB層が協力してさまざまな人員によって完了することがよくあります。 AレイヤーはFUNA関数の原因であり、B層はFUNCBの原因です。 Bレイヤーが特定のモジュールのデータを使用したい場合、彼はAレイヤースタッフに、特定のニーズを満たすデータを提供する必要があることを伝え、インターフェイスを提供します。
レベルAのスタッフは、データを提供し、それをBのビジネスであることを表示および処理する方法を提供します。
もちろん、レイヤーBはすべての要件にデータインターフェイスを提供できません。 Bは、パスするインターフェイスをaに提供します。 bデータを取得し、B関数を書き込み、表示します。
つまり、他の人と作業する必要があり、他の人はデータを提供する必要があり、他の人がどのようにデータを取得または構築するかに集中する必要はありません。取得したデータを操作するだけです。現時点でコールバック関数を使用する必要があります
したがって、コールバックは本質的にデザインパターンであり、jQuery(他のフレームワークを含む)の設計原則がこのパターンに従います。
同期でコールバックを使用する例(ブロッキング)は、FUNC1コードが実行された後にFUNC2を実行することです。
コードコピーは次のとおりです。
var func1 = function(callback){
//何かをします。
(callback && typeof(callback)=== "function")&& callback();
}
func1(func2);
var func2 = function(){
}
非同期コールバックの例:
コードコピーは次のとおりです。
$(document).ready(callback);
$ .ajax({
URL:「test.html」、
コンテキスト:document.body
})。done(function(){
$(this).addclass( "done");
})。fail(function(){
アラート( "エラー");
})。常に(function(){
Alert( "Complete");
});
Ajax要求は実際には非同期ですが、このリクエストはブラウザによって要求されます。リクエストのステータスが変更された場合、コールバックが以前に設定されていた場合、非同期スレッドは状態変更イベントを生成し、処理を待つためにJavaScriptエンジンの処理キューに入れます。参照:http://www.phpv.net/html/1700.html
いつコールバックが実行されますか
コールバック関数は通常、同期状況で最後に実行されますが、イベントがトリガーされていないか、条件が満たされないため、非同期の状況では実行されない場合があります。
コールバック関数のユースケース
リソースの読み込み:jsファイルの動的読み込み後にコールバックを実行し、iframeのロード後にコールバックを実行し、ajax操作コールバックのロード後にコールバックを実行し、画像読み込み、ajaxなどのコールバックを実行します。
DOMイベントとnode.jsイベントは、コールバックメカニズムに基づいています(node.jsコールバックには、マルチレイヤーコールバックネスティングの問題がある場合があります)。
SettimeOutの遅延時間は0です。このハックはよく使用されます。 SettimeOutによって呼び出される関数は、実際にはコールバックの具体化です
チェーンコール:チェーンコールの場合、評価者(または値を返さないメソッド)にチェーンコールを簡単に実装できますが、値ゲッターはチェーンコールを実装するのが比較的困難です。チェーンメソッドを実装する場合は、コールバック関数を使用して実装できます。
SettimeOutとSetIntervalの関数呼び出しは、返品値を取得します。どちらの機能も非同期であるため、コールタイミングとプログラムの主なプロセスは比較的独立しているため、身体のリターン値を待つ方法はありません。プログラムは開かれたときに停止し、待つことはありません。したがって、リターンを使用することは無意味であるため、コールバックは使用のみを使用できます。コールバックの意味は、タイムリーな処理のためにタイマー実行結果のプロキシ関数に通知することです。
私はいくつかの情報をオンラインで収集する必要があり、それを理解する必要があります。私は自分で例を整理します:
コードコピーは次のとおりです。
function fun(num、callback){
if(num <0){
Alert( "A-level関数を処理するように呼び出してください!");
alert( "データは負にすることはできません、入力エラー!");
} else if(num == 0){
Alert( "A-level関数を処理するように呼び出してください!");
alert( "このデータ項目は存在しません!");
}それ以外{
Alert( "Process!"を呼び出すB-level関数! ");
コールバック(1);
}
}
function test(){
var num = document.getElementById( "score")。value;
fun(num、function(back){//匿名B層処理機能
alert( ":"+back);
if(num <2)
アラート( "番号は1");
else if(num <= 3)
アラート( "数字は2または3!");
それ以外
アラート( "3より大きい数!");
})
}
関数が楽しみの実行を開始したら、最初にnumが負の数値かゼロかを判断し、それ以外の場合はB層処理機能アラート( ":"+back)を実行します。出力1、<2、<= 3、> 3などとして決定します。
経験のヒント:
コールバックが存在し、関数参照または関数式であることを確認することが最善です。
コードコピーは次のとおりです。
(callback && typeof(callback)=== "function")&& callback();
コードコピーは次のとおりです。
var obj = {
init:function(callback){
// todo ...
if(callback && typeof(callback)=== "function")&& callback()){
callback( 'init ...'); // callback
}
}
最後に、なぜコールバック関数を使用する必要があるのですか?次の比phorは非常に鮮明で興味深いです。
何かすることがある場合は、次の寮に行ってクラスメートを見つけて、その人がそこにいないことを見つけます。どうすればよいですか?
方法1:数分ごとに次の寮に行き、その人がそこにいるかどうかを確認する
方法2:彼と同じ寮の誰かに電話して、彼が戻ってくるのを見たら電話してください
前者は投票で、後者はコールバックです。
それからあなたは言う、私のクラスメートが戻ってくるまで、私は隣の寮で直接待つことができますか?
はい、しかし、このようにして、あなたは他のことをする時間を節約できたかもしれませんが、今では待つことでそれを無駄にしなければなりません。元の非ブロッキング非同期コールをブロッキング同期コールに変えます。
JavaScriptコールバックは非同期コールシナリオで使用され、コールバックの使用のパフォーマンスはポーリングよりも優れています。