ホームページ >ウェブフロントエンド >jsチュートリアル >コールバック関数、匿名関数、クロージャに関するその他の話
コールバック関数
コールバック関数は、プログラミングに慣れていない学生にとっては少し理解しにくいかもしれません。結局のところ、コールバック関数の使用は、プログラムシーケンスの実行の直感的なプロセスに反しています。
テイクアウトを注文したとします。1 つの方法は、テイクアウトが定期的に到着しているかどうかを確認することです。もう 1 つの方法は、配達員に電話番号を提示することです。
実際、この通知メカニズムをプログラミング分野に適用すると、2 番目の解決策がより効率的な解決策であることが簡単にわかります。
win32 開発に精通している学生は、典型的な Windows プログラム フレームワークがメッセージ ループとウィンドウ プロシージャ関数であることを知っているはずです。 Windows システムはメッセージの受け入れを引き継ぎ、開発者のウィンドウ プロシージャ関数を呼び出して特定のメッセージ処理ロジックを完了します。ウィンドウ プロシージャ関数はコールバック関数です。
コールバック関数が必要な理由
上記の win32 プログラムを例として考えてみましょう。セキュリティ上の理由から、Windows オペレーティング システムでは開発者がハードウェア リソースに直接アクセスできないことはわかっています。 Microsoft 開発者はメッセージ ループを処理するための API を提供していますが、特定のメッセージに対する応答ロジックは開発者が提供する必要があります。この場合、コールバック関数が適切な実装ソリューションです。
別の例を挙げると、あなたが携帯電話デバイス管理ソフトウェア プロジェクトの開発に携わっており、基礎となるデバイス通信モジュールを担当していると想像してください。ユーザーがデバイスをコンピュータに挿入したら、それを処理するように上位モジュールに通知する必要があります。柔軟性と汎用性を高めるため、デバイスが接続されたときの処理ロジックを担当するモジュールに含めることはできません。このとき、上位レベルの呼び出し元はコールバック関数を提供でき、モジュールはコールバック関数を呼び出すことができます。デバイスは接続されました。
コールバック関数に関しては、いわゆるハリウッドの基準があります。「電話しないでください。私が電話します!」
匿名関数
CやC++などの言語では、コールバック関数を使用する必要がある場合、関数本体を事前に定義する必要があります。コールバック関数は通常、コーディングを簡素化するために、他のモジュールにのみ提供されます。JavaScript などの後続のスクリプト言語は匿名関数のサポートを提供します。 (注: 新しい C++ 標準では、Lambda 関数と呼ばれる匿名関数のサポートも開始されています)
getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){ typeof cb == "function" && cb(this.globalData.userInfo) }else{ //调用登录接口 wx.login({ success: function () { wx.getUserInfo({ success: function (res) { that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } }) } },
上記のコードは、前のチュートリアルの app.js からのものであり、wx.login を呼び出すときに、論理関数を呼び出すために匿名関数が渡されます。成功後の処理は成功後の部分です。関数定義のみがあり、関数名がないことがわかります。そのため、コールバック関数としての場合を除いて、この関数を他の場所から呼び出すことはできません。
実際、匿名関数はコーディングを単純化するだけですが、それがもたらす利点はコーディングの削減だけではありません。
クロージャ
プログラミング技術において、クロージャはより高度な技術であるはずです。コールバック関数を使用する場合、通常は何らかのコンテキストを渡す必要があります。 C/C++ などの言語では、コンテキストを渡すためにグローバル変数またはヒープ メモリが使用されます。グローバル変数の欠点は明らかで、ヒープ メモリはメモリ リークを起こしやすいです。より高度なスクリプト言語では、クロージャ テクノロジを通じてコンテキスト転送を簡単に実現できます。
上記のコードを例にとると、コールバック関数で that.globalData.userInfo = res.userInfo が実行され、ユーザー情報が保存されます。 that 変数は var that = this によって割り当てられるため、変数はアプリ オブジェクトを指します。ユーザー情報の保存は成功します。
そのオブジェクトは getUserInfo メソッド スタック上の変数であることがわかります。クロージャー テクノロジがなければ、ここでの匿名コールバック関数はその変数を直接使用できません。アプリ オブジェクトはコールバック関数 (グローバル変数または関数) に渡す必要があります。パラメータ)、クロージャ テクノロジのサポートにより、コールバック関数は関数の内部変数を使用するのと同じようにその変数にアクセスできるため、構文的には非常に便利です。