JavaScriptコールバック関数の応用を簡単に分析します.
4355 ワード
一、コールバック関数の定義
コールバック関数とは、関数ポインタを介して呼び出される関数です.関数のポインタ(アドレス)をパラメータとして別の関数に渡すと、このポインタが指している関数を呼び出すために使われると、これはコールバック関数と言います.コールバック関数は、この関数の実現者によって直接呼び出されるのではなく、特定のイベントまたは条件が発生したときに、他の一方から呼び出され、イベントまたは条件に応答するために使用される.JavaScriptでは、コールバック関数は、パラメータ(関数参照)として関数Aを別の関数Bに伝達し、この関数Bが関数Aを実行するという具体的な定義があります.関数Aをコールバック関数と呼びます.名前(関数式)がない場合は、匿名のコールバック関数と呼びます.したがって、calbackは必ずしも非同期のためではなく、通常の同期(ブロック)のシーンでも、ある動作を実行した後に、コールバック関数を実行することが要求されるように、コールバックを使用することが多い.
例
一つの同期(ブロッキング)では、コールバックの例を用いて、Fnc 1コードの実行が完了した後にFnc 2を実行することを目的とする.
リソースローディング:Jsファイルを動的にロードした後、リフレクトを実行します.iframeをロードした後、フィードバックを実行します.ajax操作のフィードバック、画像ローディングが完了しました.DOMイベントおよびNode.jsイベントは、コールバック機構に基づいている(Node.jsエコーは、多層エコーネストの問題が発生する可能性がある).set Timeoutの遅延時間は0であり、このhackはよく使われています.settimeoutで呼び出される関数は実は一つのcalbackの体式チェーン呼び出しです.チェーン式呼び出しの時、賦値器の方法でチェーン式呼び出しが簡単に実現できます.なぜなら、あなたが必要とするデータを返すためには、thisポインタではなく、チェーン方式を実現するためには、リセット関数でsetTimeout、set Intervalの関数を呼び出して、その戻り値を得ることができます.両方の関数は非同期です.つまり、彼らの起動タイミングとプログラムのメインフローは相対的に独立していますので、本体の中で戻り値を待つことはできません.それらが開かれた時もプログラムは停止せずに待っています.そうでないと、set Timeoutとset Intervalの意味がなくなります.calbackは、timerが実行した結果をプロキシ関数に通知し、適時に処理するという意味です.
三、関数も対象です.
コールバック関数を理解したいのですが、まず関数のルールが分かります.javascriptでは関数が変ですが、確かにオブジェクトです.正確には、関数はFunction()構成関数で作成されたFunctionオブジェクトです.Functionオブジェクトは、関数のjavascriptコードを含む文字列を含んでいます.もしあなたがC言語やjava言語から転じたとしたら、これは変に見えるかもしれません.コードは文字列であるはずがありません.でもjavascriptにとっては普通です.データとコードの違いは曖昧です.
コールバック関数
一つの関数をパラメータとして伝達しやすい.
道をふさぐな
従来の関数はパラメータとしてデータを入力し、戻り文を使って値を返します.理論的には、関数の最後にリターンステートメントがあります.構造的には、入力点と出力点です.これは比較的理解しやすく,関数は本質的には入力と出力の間のプロセスマッピングである.
しかし、関数の実現過程が非常に長い場合、関数の処理が完了するまで待つか、それともコールバック関数を使って非同期処理を行うかを選択しますか?この場合、コールバック関数を使用することが重要になります.例えば、AJAX要求です.コールバック関数を使って処理すれば、空待ちなしに他のタスクを続けることができます.実際の開発では、頻繁にjavascriptで非同期の呼び出しを使用しても、ここでの使用を強く推奨します.
以下にAJAXを使用してXMLファイルをロードする例があり、call関数を使用して、要求対象のコンテキストでコールバック関数を呼び出します.
最終的には、第二のconsolie.logs文は、要求が完了するまで、コールバック関数が実行されるため、先に実行される.
上記の例は分かりにくいですが、以下の例を見てください.
以上が本文の全部です.javascriptプログラムの設計を勉強するのに役に立ちます.
コールバック関数とは、関数ポインタを介して呼び出される関数です.関数のポインタ(アドレス)をパラメータとして別の関数に渡すと、このポインタが指している関数を呼び出すために使われると、これはコールバック関数と言います.コールバック関数は、この関数の実現者によって直接呼び出されるのではなく、特定のイベントまたは条件が発生したときに、他の一方から呼び出され、イベントまたは条件に応答するために使用される.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(){
}
二、コールバック関数の使用の場合リソースローディング:Jsファイルを動的にロードした後、リフレクトを実行します.iframeをロードした後、フィードバックを実行します.ajax操作のフィードバック、画像ローディングが完了しました.DOMイベントおよびNode.jsイベントは、コールバック機構に基づいている(Node.jsエコーは、多層エコーネストの問題が発生する可能性がある).set Timeoutの遅延時間は0であり、このhackはよく使われています.settimeoutで呼び出される関数は実は一つのcalbackの体式チェーン呼び出しです.チェーン式呼び出しの時、賦値器の方法でチェーン式呼び出しが簡単に実現できます.なぜなら、あなたが必要とするデータを返すためには、thisポインタではなく、チェーン方式を実現するためには、リセット関数でsetTimeout、set Intervalの関数を呼び出して、その戻り値を得ることができます.両方の関数は非同期です.つまり、彼らの起動タイミングとプログラムのメインフローは相対的に独立していますので、本体の中で戻り値を待つことはできません.それらが開かれた時もプログラムは停止せずに待っています.そうでないと、set Timeoutとset Intervalの意味がなくなります.calbackは、timerが実行した結果をプロキシ関数に通知し、適時に処理するという意味です.
三、関数も対象です.
コールバック関数を理解したいのですが、まず関数のルールが分かります.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() :
window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP" ) : undefined;// IE
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の実行が終了しても.その機能領域は保存されますが、戻ってきた関数だけがこの保存された作用領域にアクセスできます.埋め込まれた匿名関数を返すことは、クローズド・パケットを作成するのに最も一般的な手段である.以上が本文の全部です.javascriptプログラムの設計を勉強するのに役に立ちます.