0

私のコード:

myobj = new Object();
classes.testegy = Class.extend({
    init: function (token) {
        console.log("test egy");
        setInterval(function () {
            console.log('hello');
        }, 300);
    },
    testt: function () {
        console.log("luli");
    }
});
classes.testketto = Class.extend({
    init: function (token) {
        console.log("test ketto");
    }
});
classes.site = Class.extend({
    init: function (token) {
        var myobj = new Object();
        myobj.lel1 = new classes.testegy();
        myobj.lel2 = new classes.testketto();
        console.log(myobj);
        delete myobj.lel1;
        myobj.lel1.testt();
    }
});
var class = new classes.site();

myobj.lel1オブジェクトを削除すると、オブジェクトは削除されますが、setIntervalはtestegyクラスに入ります。なんで?オブジェクトを完全に削除するにはどうすればよいですか?ありがとう

編集:

たとえば、setIntervalを使用しない場合は、クリックとコンソールログを使用します。

classes.testegy = Class.extend({
init: function(token){
    console.log("test egy");
    $(".piii").live("click", function() {
        console.log("hello");
    });

},
foo: function() {
    console.log("pina");
}
});

classes.testketto = Class.extend({
init: function(token){
    console.log("test ketto");
}   
});

classes.site = Class.extend({
init: function(token){
    var myobj = new Object();

    myobj.lel1 = new classes.testegy();
    myobj.lel2 = new classes.testketto();

    console.log(myobj);

    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();
    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();
    delete myobj.lel1;
    myobj.lel1 = new classes.testegy();

}   
});

戻り値:1クリックイベント->4xクリック=4xコンソールログ:(4つのシャドウオブジェクトが作成されました。

4

3 に答える 3

2

クリーニング機能を定義する必要があります。まず、:への参照を保持しsetIntervalます

init: function(token){
    console.log("test egy");
    this.interval = setInterval(function() { console.log('hello'); }, 300);
}

次に、クリーニング機能を(プロトタイプで)定義します。

clean: function() {
    clearInterval(this.interval);
}

最後myobj.lel1.clean()に、削除する前に呼び出します。

編集

編集されたコードの問題は異なります。これを見てください:

init: function(token){
    console.log("test egy");
    $(".piii").live("click", function() {
        console.log("hello");
    });
}

新しいオブジェクトを初期化するたびに、この関数はのクリックイベントに新しいハンドラーを追加.piiiします。あなたがしなければならないことはこのコードを使うことです:

$(".piii").live("click", function() {
    console.log("hello");
});

オブジェクト定義の外側。または、$(".piii").unbind('click').click(/* handler */)内部で使用できますinit

ところで。.liveメソッドが古くなっています。.on今すぐ使用してください。

于 2012-06-27T15:08:53.123 に答える
0

myobj.lel1オブジェクトを削除すると、オブジェクトは削除されますが、setIntervalはtestegyクラスに入ります。なんで?

deleteオペレーターはオブジェクトへの参照を削除するだけで、ある時点でガベージコレクターがこのオブジェクトが存在するメモリを解放するためです。間隔を削除する唯一の方法は、次のようなclearIntervalメソッドを使用することです。

...
init: function(token){
    console.log("test egy");
    this.interval = setInterval(function() { console.log('hello'); }, 300);
},
...

//then before calling delete you need to call clearInterval
clearInterval(obj.interval);
obj = null;

または、すべてのクリーンアップを別の方法にカプセル化することもできます。

cleanup: function() {
    clearInterval(this.interval);
}
于 2012-06-27T15:11:22.810 に答える
0

setIntervalタイマーの識別子を返します。この識別子を使用してタイマーclearIntervalを停止できます。clearIntervalオブジェクトを破棄する前に、それを呼び出す必要があります。

于 2012-06-27T15:09:35.307 に答える