基本的に、JavaScriptガベージコレクターがそれらを収集できるように、これらの関数へのすべての参照を削除する必要があります。それらがバインドされている場合は、バインドを解除する必要があります。それらを指す他の変数がそこにある場合は、それらをnullに設定する必要があります。
コードを投稿すると役立つ場合があります。そうすれば、より良い答えを出すことができます。
...編集:
ここで起こっていることは、含まれている関数よりも長持ちするクロージャを作成しているということです。
function edit(){
$('.edit').click(function(){
//...
function _edit(boxTitle,selectedItemAmount){
//...
$('#box .yes').click(function(){
alert(boxTitle + ' for ' + selectedItemAmount + ' selected item');
$('#msg').hide(); // hide msg box when yes btn is clicked
});
}
//...
$('#box .no').click(function(){
$('#msg').hide();
});
});
つまり、関数内では、「この関数をDOMオブジェクトにアタッチする」と言っており、インラインで実行しています。JavaScriptは、外部コンテキストから変数をキャプチャし、内部コンテキストへの参照が有効である間、それらを有効に保ちます。
あなたがする必要があるのは、インラインではない場所で関数を定義してからそれらを使用することです:
function boxClickYes(e) {
alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount +
' selected item');
$('#msg').hide(); // hide msg box when yes btn is clicked
}
function boxClickNo(e) {
$('#msg').hide();
}
function edit(){
$('.edit').click(function(){
//...
function _edit(boxTitle,selectedItemAmount){
//...
$('#box .yes').bind("click", {boxTitle: boxTitle,
selectedItemAmount: selectedItemAmount}, boxClickYes);
}
//...
$('#box .no').click(boxClickNo);
});
これは、jQueryクリックハンドラーのデータプロパティを使用して、ハンドラーをアタッチしてから使用するまでの間にデータを格納する方法も示しています(スコープチェーンをメモリに保持するクロージャーにデータを格納する代わりに)。インライン定義関数を使用する場合は、その場で使用する場合は問題ありませんが($.each
たとえば、の本体など)、イベントハンドラーをアタッチする場合は問題ありません。