1。コールバック関数の定義
コールバック関数は、関数ポインターを介して呼び出される関数です。関数のポインター(アドレス)を別の関数の引数として渡すと、このポインターが指し示される関数を呼び出すために使用される場合、これはコールバック関数であると言います。コールバック関数は、関数の実装者によって直接呼び出されるのではなく、特定のイベントまたは条件が発生した場合に別の当事者によって呼び出され、イベントまたは条件に応答するために使用されます。
JavaScriptでは、コールバック関数の特定の定義は次のとおりです。関数Aはパラメーター(関数参照)として別の関数Bに渡され、この関数Bは関数Aを実行します。名前(関数式)がない場合、匿名のコールバック関数と呼ばれます。したがって、コールバックは必ずしも非同期に使用されるわけではありません。コールバックは、一部の操作を実行する必要があり、コールバック関数が実行されるなど、一般的な同期(ブロッキング)シナリオでよく使用されます。
例
同期でコールバックを使用する例(ブロッキング)は、FUNC1コードが実行された後にFUNC2を実行することです。
var func1 = function(callback){//何かをします。 (callback && typeof(callback)=== "function")&& callback();} func1(func2); var func2 = function(){}2。コールバック関数の機会を使用します
リソースの読み込み: jsファイルの動的読み込み後にコールバックを実行し、iframeのロード後にコールバックを実行し、ajax操作コールバックのロード後にコールバックを実行し、画像読み込み、ajaxなどのコールバックを実行します。
DOMイベントとnode.jsイベントは、コールバックメカニズムに基づいています(node.jsコールバックには、マルチレイヤーコールバックネスティングの問題がある場合があります)。
SettimeOutの遅延時間は0です。このハックはよく使用されます。 SettimeOutによって呼び出される関数は、実際にはコールバックの具体化です
チェーンコール:チェーンコールの場合、評価者(または値を返さないメソッド)にチェーンコールを簡単に実装できますが、値ゲッターはチェーンコールを実装するのが比較的困難です。チェーンメソッドを実装する場合は、コールバック関数を使用して実装できます。
SettimeOutとSetIntervalの関数呼び出しは、返品値を取得します。どちらの機能も非同期であるため、コールタイミングとプログラムの主なプロセスは比較的独立しているため、身体のリターン値を待つ方法はありません。プログラムは開かれたときに停止し、待つことはありません。したがって、リターンを使用することは無意味であるため、コールバックは使用のみを使用できます。コールバックの意味は、タイムリーな処理のためにタイマー実行結果のプロキシ関数に通知することです。
3。関数もオブジェクトです
コールバック関数を理解したい場合は、まず関数のルールを明確に理解する必要があります。 JavaScriptでは、関数は奇妙ですが、実際にはオブジェクトです。正確には、関数はfunction()constructorで作成された関数オブジェクトです。関数オブジェクトには、関数のJavaScriptコードを含む文字列が含まれています。 CまたはJavaから転送された場合、これは奇妙に思えるかもしれませんが、どのようにコードが文字列になるのでしょうか?しかし、JavaScriptの場合、これはかなり一般的です。データとコードの違いはあいまいです。
//この方法で機能することができますvar fn = new function( "arg1"、 "arg2"、 "return arg1 * arg2;"); fn(2、3); // 6
これの利点の1つは、コードを他の関数に渡すことができるか、通常の変数またはオブジェクトを渡すことができることです(コードは文字通りオブジェクトであるため)。
コールバックとして関数を転送します
パラメーターとして関数を渡すのは簡単です。
関数fn(arg1、arg2、callback){var num = math.ceil(math.random() *(arg1 -arg2) + arg2); callback(num); //結果を渡す} fn(10、20、function(num){console.log( "callback calling!num:" + num);}); //結果は10〜20のランダム数ですたぶんこれを行うと、面倒で少し愚かなように思えますが、結果を異常に返してみませんか?しかし、コールバック関数を使用する必要がある場合、そうは思わないかもしれません!
邪魔しないでください
従来の関数はパラメーターとしてデータを入力し、返品ステートメントを使用して値を返します。理論的には、関数の最後に戻り返品ステートメントがあります。これは、入力ポイントと出力ポイントです。これは理解しやすいです。関数は、本質的に入力と出力の間の実装プロセスをマッピングしています。
ただし、関数の実装プロセスが非常に長い場合、関数が処理を完了するのを待つか、コールバック関数を使用して非同期処理を実行する必要がありますか?この場合、次のようなコールバック関数を使用することが重要になります。処理にコールバック関数を使用する場合、コードは空にせずに他のタスクを実行し続けることができます。実際の開発では、非同期呼び出しは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.onededstatechange = function(){){){){(httprequest.status ======== {//ステータス審査コールバック(htprequest.call); }}; httprequest.open( "get"、url); httprequest.send();} fn( "text.xml"、function(){// function console.log(this); //このステートメントの後に出力}); console.log( "これは上記のコールバックの前に実行されます。"); //このステートメントは最初に出力されます非同期処理のリクエストは、要求を開始するときに、それらが終了したときに関数を呼び出すように指示することを意味します。実際の状況では、OnreadedStateChangeイベントハンドラーもリクエストの失敗を考慮する必要があります。ここでは、XMLファイルが存在し、ブラウザによって正常にロードできると仮定します。この例では、非同期関数はOnreadedStateChangeイベントに割り当てられているため、すぐに実行されません。
最後に、コールバック関数がリクエストが完了するまで実行されないため、2番目のConsole.logステートメントが最初に実行されます。
上記の例を理解するのは簡単ではないので、次の例を見てください。
function foo(){var a = 10; return function(){a *= 2; aを返します。 }; } var f = foo(); f(); // 20.fを返します(); // 40を返します。関数は外部から呼ばれ、変数aにアクセスできます。これは、JavaScriptの範囲が語彙的であるためです。この関数が実行されるスコープではなく、機能がそれらを定義するスコープ(上記の例のFOO内のスコープ)で実行されます。 FOOでFが定義されている限り、FOOの実行が終了した場合でも、FOOで定義されたすべての変数にアクセスできます。そのスコープは保存されるためですが、返された関数のみが保存されたスコープにアクセスできます。埋め込まれた匿名関数を返すことは、閉鎖を作成する最も一般的な方法です。
上記はこの記事に関するものです。誰もがJavaScriptプログラミングを学ぶことが役立つことを願っています。