1

SQL selectが空のセットを非同期的に返すかどうかを判断するには?結局、オブジェクトのメソッドをイベントハンドラーとして使用しようとしました。オブジェクトの通常の「this」を使用することは、イベントハンドラーのコンテキストでのメソッドのオブジェクトに対応しません(なぜ、JavaScriptの現在の単純な理解を超えて、私の推測は変数名のスコープによるものですか?)。

以前のQで述べたように、http://w3future.com/html/stories/callbacks.xmlから、彼らの解決策は基本的に各オブジェクトに「var me=this」変数を提供させることです。私の質問は、これはオブジェクトがガベージコレクションされるのを防ぐ循環参照を作成しますか?

もしそうなら、タスクを達成するためのより良い方法はありますか?

ありがとう。

4

2 に答える 2

2

はい、循環参照が作成されます。

ただし、問題は発生しません。
最新のJavascriptガベージコレクターは、循環参照を完全に処理できます。(IE6では、DOMとユーザーオブジェクト間の参照を除く)

于 2012-07-04T15:11:29.590 に答える
0

それsを参照するすべてのものが到達可能なスコープを離れるか、手動で削除された場合、ガベージコレクションが行われます。削除してもコールバックへの参照がある場合sstatement.executeAsyncへの参照meも残ります。

delete s;
s; //undefined

//This will still contain the function reference
statement.executeAsync.handleResult;

delete statement; //Now s and me should be garbage collected

ステートメントオブジェクトではなく、各ハンドラーを個別にクリアするだけであれば、それも機能します。各コールバックに個別に到達できると仮定します。

delete statement.executeAsync.handleResult;
delete statement.executeAsync.handleError;
delete statement.executeAsync.handleCompletion;

これは、executeAsyncの実装方法にも依存します。内部実装が最後のコールバックを過ぎて存続するスコープにコールバックを保存しない場合、削除するとクリーンアップされますs

于 2012-07-04T15:28:11.460 に答える