5

javascript(jquery)関数を破棄する方法を知っている人はいますか?jqueryの「selectable」を使用していますが、選択可能な「stop」イベントで関数呼び出し「edit」が発生します。

この「編集」関数内には、多くの「クリック」イベントを含むネストされたスイッチ関数があり、各「クリック」イベント内には多くの関数があります。私の問題は、「選択可能な」関数を起動するたびに、関数「edit」内のイベントが再度起動されますが、以前の関数とイベントはまだ存在しているということです。私が今していることは、選択可能な「開始」でも関数「編集」のすべてのイベントのバインドを解除することです。

これはメモリリークの問題ですか?そして、javascriptの関数を「破壊」する方法はありますか?関数が終了したときに関数をnullと宣言しようとしましたが、これは機能しません。その中の関数とイベントはまだ存在しています。

誰か手がかりがありますか?

こちらのデモページ-> http://dreamerscorp.com/test/test01/javascript_destory_test.html

編集2009/10/31:)あなたの助けに感謝します、あなたのコメントは私にとって非常に役に立ちます、もう一度ありがとう!!!

4

4 に答える 4

13

関数を無効にするか、何もしない無名関数を割り当ててオーバーライドすることができます。

myFunction = null;
// or 
myFunction = function () {};

関数自体の中でそれを行うこともできます:

var autoDestroy = function () {
  autoDestroy = null;
  //...
  return 1;
};

autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
于 2009-10-30T04:14:46.923 に答える
6

jqueryでイベントのバインドを解除するには、unbind関数http://docs.jquery.com/Events/unbindを使用します

$("something").click(function() {
    $("anotherOne").click(function() {
         ....
    });
});

この例では、「何か」がクリックされるたびに、イベントハンドラーが「anotherOne」に追加されるため、3回クリックすると、3つのイベントハンドラーが取得されます。

$("something").click(function() {
    $("anotherOne").unbind('click').click(function() {
         ....
    });
});

ここでは、「anotherOne」でクリックハンドラーが1つだけであることが保証されています。

以前のハンドラーを明示的に破棄する必要はありません。

于 2009-10-30T08:41:09.443 に答える
5

基本的に、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たとえば、の本体など)、イベントハンドラーをアタッチする場合は問題ありません。

于 2009-10-30T04:21:52.317 に答える
1

javascriptで関数を「破棄」するには、関数が到達不能になることを確認するだけです。これにより、関数がレクラメーションの対象になります。注意すべき点の1つは、javascript変数は(個々の変数としてではなく)スコープに基づいてバインドされ、バインドがスコープに保持されている場合、未使用のオブジェクトが多数あるスコープが存続する可能性があることです 。特定のコードとその使用方法。

変数またはオブジェクトメンバーを削除する1つの方法として、javascriptdelete演算子を参照してください。値をnull/undefined / other-objectに設定すると、以前に参照されたオブジェクトに到達するメソッドが削除されます(ただし、他の方法では到達可能であるため、再利用されない可能性があります)が、変数/メンバーは削除されません。

delete variable
delete obj.member
delete obj[member]
于 2009-10-30T04:51:44.073 に答える