JavaScript学習ノート7-付録(戻り関数)

5692 ワード

関数もオブジェクトです
コールバック関数を理解したいのですが、まず関数のルールが分かります.javascriptでは関数が変ですが、確かにオブジェクトです.正確には、関数はFunction()構成関数で作成されたFunctionオブジェクトです.Functionオブジェクトは、関数のjavascriptコードを含む文字列を含んでいます.もしあなたがC言語やjava言語から転じたとしたら、これは変に見えるかもしれません.コードは文字列であるはずがありません.でもjavascriptにとっては普通です.データとコードの違いは曖昧です.
//        
var fn = new Function("arg1", "arg2", "return arg1 * arg2;");
fn(2, 3); //6
このようにする利点は、コードを他の関数に渡すことができます.正規変数やオブジェクトを伝えることもできます.
コールバック関数
一つの関数をパラメータとして伝達しやすい.
function fn(arg1, arg2, callback){
 var num = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
 callback(num);  //    
}
 
fn(10, 20, function(num){
 console.log("Callback called! Num: " + num); 
});    //   10 20       
このようにして見ると面倒臭いかもしれません.愚かなところもありますが、なぜ正常に結果に戻りませんか?しかし、コールバック関数を使用しなければならない場合は、そうは思わないかもしれません.
道をふさぐな
従来の関数はパラメータとしてデータを入力し、戻り文を使って値を返します.理論的には、関数の最後にリターンステートメントがあります.構造的には、入力点と出力点です.これは比較的理解しやすく,関数は本質的には入力と出力の間のプロセスマッピングである.
しかし、関数の実現過程が非常に長い場合、関数の処理が完了するまで待つか、それともコールバック関数を使って非同期処理を行うかを選択しますか?この場合、コールバック関数を使用することが重要になります.例えば、AJAX要求です.コールバック関数を使って処理すれば、空待ちなしに他のタスクを続けることができます.実際の開発では、頻繁にjavascriptで非同期の呼び出しを使用しても、ここでの使用を強く推奨します.
以下にAJAXを使用してXMLファイルをロードする例があり、call関数を使用して、要求対象のコンテキストでコールバック関数を呼び出します.
function fn(url, callback){
 var httpRequest;    //  XHR
 httpRequest = window.XMLHttpRequest ? new XMLHttpRequest() :   //  IE       
    window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : undefined;
  
 httpRequest.onreadystatechange = function(){
  if(httpRequest.readystate === 4 && httpRequest.status === 200){  //    
   callback.call(httpRequest.responseXML); 
  }
 };
 httpRequest.open("GET", url);
 httpRequest.send();
}
 
fn("text.xml", function(){    //    
 console.log(this);   //      
});
 
console.log("this will run before the above callback.");  //       
非同期処理を要求するということは、私たちが要求を開始すると、それらが完了したら私たちの関数を呼び出すということです.実際には、Oreadystatechangeイベントハンドラは要求失敗の状況も考慮しなければなりません.ここでは、xmlファイルが存在し、ブラウザによって成功的にロードされると仮定しています.この例では、非同期関数はオンレドステージイベントに割り当てられていますので、すぐには実行されません.
最終的には、第二のconsolie.logs文は、要求が完了するまで、コールバック関数が実行されるため、先に実行される.
上記の例は分かりにくいですが、以下の例を見てください.
function foo(){
 var a = 10;
 return function(){
  a *= 2;
  return a;  
 }; 
}
var f = foo();
f(); //return 20.
f(); //return 40.
関数は外部で呼び出しますが、変数aにアクセスできます.これはすべてjavascriptの中の作用域が語法的なためです.関数的な動作は、これらの作用領域(上記の例ではfoo内部の作用領域)を定義するもので、この関数を実行する作用領域ではありません.fがfooに定義されている限り、fooで定義されているすべての変数にアクセスできます.たとえfooの実行が終了しても.その機能領域は保存されますが、戻ってきた関数だけがこの保存された作用領域にアクセスできます.埋め込まれた匿名関数を返すことは、クローズド・パケットを作成するのに最も一般的な手段である.
コールバックは何ですか
ウィキペディアのCallbackを見ます.(computter upurgramming)項目:
In computter programming、a calback is a reference to a piece of executable code that is passed as an argto other code.
jQuery文書How jQuery Works嗳Callbackand_Function...エントリ:
A calback is a function that is passed as an argment to another function and is executed after its parent function has complected.The special thing about a calback is that functions atthe「parent」can execute before the calback executes.Another importent thing to know is how to properly pass the calback.This is is where I have forgotten the proper sysntax.
百科:コールバック関数
コールバック関数とは、関数ポインタを介して呼び出される関数です.関数のポインタ(アドレス)をパラメータとして別の関数に渡すと、このポインタが指している関数を呼び出すために使われると、これはコールバック関数と言います.コールバック関数は、この関数の実現者によって直接呼び出されるのではなく、特定のイベントまたは条件が発生したときに、他の一方から呼び出され、イベントまたは条件に応答するために使用される.
したがって、フィードバックは本質的に設計モードであり、jQuery(他のフレームを含む)の設計原則はこのパターンに従う.
JavaScriptでは、コールバック関数は、パラメータ(関数参照)として関数Aを別の関数Bに伝達し、この関数Bが関数Aを実行するという具体的な定義があります.関数Aをコールバック関数と呼びます.名前(関数式)がない場合は、匿名のコールバック関数と呼びます.
したがって、calbackは必ずしも非同期のためではなく、通常の同期(ブロック)のシーンでも、ある動作を実行した後に、コールバック関数を実行することが要求されるように、コールバックを使用することが多い.
例の同期(ブロッキング)では、コールバックの例を用いて、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            。*/
コールバックはいつ実行しますか?
コールバック関数は、通常同期された状況で最後に実行されますが、非ステップの状況では実行されない可能性があります.イベントがトリガされていないか、または条件が満たされていないためです.
コールバック関数の使用の場合
リソースローディング:Jsファイルを動的にロードした後、リフレクトを実行します.iframeをロードした後、フィードバックを実行します.ajax操作のフィードバック、画像ローディングが完了しました.DOMイベントおよびNode.jsイベントは、コールバック機構に基づいている(Node.jsエコーは、多層エコーネストの問題が発生する可能性がある).
set Timeoutの遅延時間は0です.このhackはよく使われます.settimeoutで呼び出される関数は実は一つのcalbackの表現です.
チェーンコール:チェーンコールの場合、賦値器(setter)の方法では(または自身がリターン値を持っていない方法で)チェーンコールが簡単に実現できます.一方、デポジット(getter)は相対的にチェーンコールがうまく実現できません.set Intervalの関数が呼び出され、その戻り値が得られます.両方の関数は非同期です.つまり、彼らの起動タイミングとプログラムのメインフローは相対的に独立していますので、本体の中で戻り値を待つことはできません.それらが開かれた時もプログラムは停止せずに待っています.そうでないと、set Timeoutとset Intervalの意味がなくなります.calbackは、timerが実行した結果をプロキシ関数に通知し、適時に処理するという意味です.
コールバック関数の転送
上記のように、関数参照または関数表現をパラメータとして伝達します.
$.get('myhtmlpage.html', myCallBack);//    
$.get('myhtmlpage.html', myCallBack('foo', 'bar'));//    ,       ?
$.get('myhtmlpage.html', function(){//           
myCallBack('foo', 'bar');
});
また、コールバックの存在を保証し、関数参照または関数式でなければなりません.
(calback&typeof(=calback)===「function」)&&calback();