Javascriptコールバック関数の理解

4279 ワード

関数をパラメータとして別の関数に入力します.この関数はいわゆるコールバック関数です
あるプロジェクトのA層とB層は異なる人員が協働して完成する場合が多い.A層は機能funA,B層はfuncBを担当する.B層がモジュールのデータを使うとき、彼はA層の人に言った.私はあなたたちに何らかの需要を満たすデータを提供する必要があります.あなたは私にインタフェースを提供してください.
A階の人は「データを提供しますが、どのように展示して処理するかはBのことです」と話しています.もちろん、B層はあなたのニーズごとにデータインタフェースを提供することはできません.BはAに通過するインタフェースを提供します.Bはデータを得て、Bは関数を書いて展示します.
つまり、他の人と協力して、他の人がデータを提供し、他の人がデータを取得したり構築したりする方法に注目する必要はありません.これを手に入れたデータを操作すればいいです.コールバック関数を使用する必要があります
従って、コールバックは本質的に設計モードであり、jQuery(他のフレームワークを含む)の設計原則はこのモードに従う.
同期(ブロック)でコールバックを使用する例で、func 1コードの実行が完了した後にfunc 2を実行することを目的とする.
 
  
var func1=function(callback){
    //do something.
    (callback && typeof(callback) === "function") && callback();
}

func1(func2);
    var func2=function(){
}


非同期コールバックの例:
 
  
$(document).ready(callback);

    $.ajax({
        url: "test.html",
        context: document.body
    }).done(function() {
        $(this).addClass("done");
    }).fail(function() {
        alert("error");
    }).always(function() {
        alert("complete");
    });


なお、ajaxリクエストは確かに非同期ですが、このリクエストはブラウザによって新しくスレッドリクエストが開かれ、リクエストのステータス変更時にコールバックが設定されている場合、この非同期スレッドはステータス変更イベントを生成してJavaScriptエンジンの処理キューに格納して待機します.参照:http://www.phpv.net/html/1700.html
コールバックはいつ実行されますか
コールバック関数は、通常、同期シナリオでは最後に実行されますが、イベントがトリガーされていないか、条件が満たされていないため、非同期シナリオでは実行されない可能性があります.
コールバック関数の使用状況
リソースのロード:動的にjsファイルをロードした後にコールバックを実行して、iframeをロードした後にコールバックを実行して、ajax操作のコールバック、ピクチャーのロードは完成してコールバックを実行して、AJAXなど.DOMイベントおよびNode.jsイベントはコールバックメカニズムに基づいている(Node.jsコールバックでは多層コールバックネストの問題が発生する可能性がある).settimeoutの遅延時間は0で、このhackはよく使われています.settimeoutが呼び出す関数は実はcallbackの体現です.
チェーン呼び出し:チェーン呼び出しの場合、賦値器(setter)メソッド(またはそれ自体が値を返さないメソッド)ではチェーン呼び出しが容易に実現されますが、取値器(getter)は相対的にチェーン呼び出しを実現しにくいです.thisポインタではなく、取値器が必要なデータを返す必要があるため、チェーンメソッドを実現するには、コールバック関数で実現できます.
settimeout、setIntervalの関数呼び出しは、その戻り値を得る.両方の関数は非同期であるため、すなわち、彼らの呼び出しタイミングとプログラムのメインフローは相対的に独立しているため、本体の中でそれらの戻り値を待つことができず、それらが開かれたときにプログラムも停止して待つことはできない.そうしないとsettimoutとsetIntervalの意味を失うため、returnでは意味がなく、callbackしか使用できない.callbackの意味はtimerが実行した結果をエージェント関数に通知してタイムリーに処理することである.
ネット上で資料を収集して、理解したはずで、自分で1つの例を整理します:
 
  
function fun(num,callback){
    if(num<0)  {
        alert(" A !");
        alert(" , !");
    }else if(num==0){
        alert(" A !");
        alert(" !");
    }else{
        alert(" B !");
        callback(1);
    }
}
function test(){
    var num=document.getElementById("score").value;
    fun(num,function(back){ // B
    alert(":"+back);
        if(num<2)
            alert(" 1");
        else if(num<=3)
            alert(" 2 3!");
        else
            alert(" 3!");
    })
 }

関数がfunを実行し始めると、numが負数であるかゼロであるかを判定し、そうでなければB層処理関数alert(":"+back")を実行する.出力1は、<2、<=3、>3などと判定される.
経験のヒント:
コールバックが存在し、関数参照または関数式でなければならないことを保証することが望ましい.
 
  
(callback && typeof(callback) === "function") && callback();
 
  
 var obj={
        init : function(callback){
        //TODO ...
        if(callback && typeof(callback) === "function") && callback()){
              callback('init...');//
        }
    }

 
最後に、コールバック関数を使用する理由について説明します.次の比喩は生き生きとして面白い.
あなたは用事があって隣の寝室に行って同級生を探して、人がいないことに気づいて、あなたはどうしますか?
方法1、数分おきに隣の寝室に行って、人がいるかどうかを見に行きます2、彼と同じ寝室の人に頼んで、彼が帰ってきたのを見てあなたを呼んでください
前者はポーリング、後者はコールバックです.
じゃ、隣の寝室で同級生が帰ってくるまで待ってもいいですか.
いいですよ.ただ、これで他のことをする時間を節約することができます.今は待つのに無駄にしなければなりません.元の非ブロックの非同期呼び出しをブロックの同期呼び出しに変えた.
JavaScriptのコールバックは非同期呼び出しシーンで使用され、ポーリングよりもコールバックのパフォーマンスが優れています.