メモリ リークを防ぐために使用される null への代入の修正の性質に関して、誰かが私のためにかゆみを掻くことができますか?
メモリ リークを防ぐために、DOM オブジェクトと JS オブジェクト間の循環参照を停止する次の手法はよく知られています。
function foo() {
var ele = document.getElementById("someParagraphId");
ele.onclick = function() {
//some action here
};
ele = null;
}
問題は、なぜ上記が機能するのかということです。「ele」を null に設定すると、循環参照は確実に停止しますが、「ele」への将来の参照も防止されませんか?
function foo() {
var ele = document.getElementById("someParagraphId");
ele.onclick = function() {
console.log("accessing ele ... after set to null " + ele.onclick);
};
ele = null;
}
それでも、イベントリスナーが起動します。「ele」オブジェクトがnullであると不平を言うでしょう(これは私たちが期待することです)。
上記の動作を考えると、Javascript エンジンの実装がイベント リスナーへの何らかの内部参照を保持し、イベントがトリガーされたときに呼び出されるのはこの参照であると推測するのは正しいでしょうか?
eventHandlerRef = //assignment to "ele.onclick" handler/listener;
上記のような参照があった場合、null への代入の修正は実装依存ではないでしょうか。それとも、ECMAScript 仕様の一部ですか。
私の理解では、この修正は常にクロス ブラウザーに対して安全です。null 割り当てを適用する前に、ブラウザーの種類を検出/スニッフィングすることについて具体的に言及している例はあまり見当たりません。
===============編集==================
質問の仕方が原因で、私が伝えようとしていたことから、無意識のうちに直接的な議論をしてしまう可能性があると思います。参照されているいくつかの概念:
オブジェクト ハンドル/オブジェクト参照 ala:
var obj1, obj2;
obj1 = {foo: "bar"}; //obj1 points to the an area of the heap allocated
//for the object literal.
obj2 = obj1; //obj2 points to the same position in the heap
//as obj1.
//obj1 = null or
obj1 = {/*another obj literal*/} //the new object literal is created
//and allocated in some other part
//in the heap, and obj1 now points
//to the new location.
//obj2 is unaffected by obj1's re-assignment.
上記は私のかゆみがある場所ではなく、次の行を追加したことを後悔しています。
console.log("accessing ele ... after set to null " + ele.onclick);
上記は、これを閉鎖の質問に見せます。元の投稿に示されているように、エラーがスローされることを完全に期待していました。
私のかゆみは...のコンテキストに沿ったものですが、何らかの理由で、ele.onlick()
イベントが発生したときにJavascriptエンジンが直接呼び出し、要素をnullに設定することは、次のフローに似ていると考え続けています:
var obj = {};
obj.method = function() {};
obj = null;
//error calling obj.method(), i.e., obj is null
元の投稿で、ele が null に設定された後もイベント ハンドラーが起動することがわかっていることを考えると、私の考えでは、フローは次のようになります。
var obj = {};
obj.method = function() {};
var objRef = obj;
obj = null;
//The Javascript Engine calling objRef.method when event triggered.
私のかゆみは、上記のほとんどの Javascript 実装がどのように機能するか、割り当てられたイベントハンドラーを指している内部参照であり、イベントがトリガーされたときに呼び出されるのはこの内部参照ですか?
または別の言い方をすれば、JavaScript エンジンの実装が を直接呼び出すの ele.onclick()
を妨げているのは何ですか (設計とアーキテクチャの問題はさておき)。
多分私の思考プロセスは異なって動作しますが、最初にnullへの代入の修正に遭遇したとき、要素参照がnullであり、ハンドラーのコードがまだ実行?