javascriptコールバック関数を再理解する

5928 ワード


関数をパラメータとして別の関数に入力します.この関数はいわゆるコールバック関数です.
よくこのような状況に遭遇します.あるプロジェクトのA層とB層は異なる人員で共同で完成します.A層は機能funA、B層はfuncBを担当します.B層があるモジュールのデータを使う時、彼はA層の人員に対して、ある種類の需要を満たすデータを提供してほしいと言っています.インタフェースを提供してください.
A階のスタッフは、データを提供します.どのように展示して処理するかはBのことです.もちろんB層はそれぞれの需要に対して一つのデータインターフェースを提供することができません.BはAに通過するインターフェースを提供します.Bはデータを得て、Bは関数を書いて展示します.
つまり、あなたは他の人と協力して、他の人がデータを提供する必要があります.他の人がデータを取得したり構築する方法に注目する必要はありません.これを入手したデータだけ操作してください.この場合はコールバック関数を使う必要があります.
したがって、フィードバックは本質的に設計モードであり、jQuery(他のフレームを含む)の設計原則はこのパターンに従う.
 
 
一つの同期(ブロッキング)では、コールバックの例を用いて、Fnc 1コードの実行が完了した後にFnc 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イベントおよびノード.jsイベントは、コールバック機構に基づいている(Node.jsエコーは、多層エコーネストされた問題が発生する可能性がある).
  • setTimeoutの遅延時間は0であり、このhackはよく使われています.settimeout呼び出しの関数は実はcalbackの表現
  • です.
  • チェーンコール:チェーンコールの場合、賦値器(setter)方法では、チェーンコールが容易に実現されます.一方、デシフタ(getter)は、比較的にチェーンコールがうまく実現できません.コールバック関数で
  • を実現できます.
  • setTimeout、set Intervalの関数呼び出しは、その戻り値を得る.両方の関数は非同期です.つまり、彼らの起動タイミングとプログラムのメインフローは相対的に独立していますので、本体の中で戻り値を待つことはできません.それらが開かれた時もプログラムは停止せずに待っています.そうでないと、set Timeoutとset Intervalの意味がなくなります.calbackは、timerが実行した結果をプロキシ関数に通知し、適時に処理するという意味です.
  • (参考于:http://segmentfault.com/q/1010000000140970)
     
    インターネットで資料を集めて、分かりました.自分で例をまとめました.
    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などと判定した場合.
     
    経験のヒント:
    コールバックが存在し、関数参照または関数式が必要です.
     var obj={ init : function(callback){ //TODO ...
            if(callback && typeof(callback) === "function") && callback()){ callback('init...');//  
     } }
     
    最後に、なぜコールバック関数を使うのですか?下の比喩はとても生き生きしていて面白いです.
    隣の部屋に用事があって、クラスメートを探しに行きます.人がいないことに気づきました.どうすればいいですか?
    方法1、数分おきに隣の部屋に行って、人を見てもいいですか?2、彼と同じ寝室の人にお願いします.彼が帰ってくるのを見たら、あなたを呼びます.
    前者はポーリングで、後者はコールバックです.
     
    隣の寝室で直接にクラスメートが帰ってくるまで待ってもいいですか?
    いいですよ.でも、これで他のことをする時間を節約できます.今は待つ時間を浪費しなければなりません.元の非ブロックの非同期呼び出しをブロックの同期呼び出しに変えました.
    JavaScriptのコールバックは、非同期のコールシーンで使用され、リターン性能をポーリングよりも使用します.