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 时,使用 click 和控制台日志。

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 次点击事件 -> 4 次点击 = 4 次控制台日志 :( 它创建了 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");
    });
}

每当您初始化新对象时,此函数都会新处理程序添加到 click 事件.piii。您要做的是使用以下代码:

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

在对象定义之外。或者你可以$(".piii").unbind('click').click(/* handler */)在里面使用init

顺便提一句。.live方法已过时。现在使用.on

于 2012-06-27T15:08:53.123 回答
0

setInterval返回计时器的标识符,然后可以通过clearInterval它来停止它。您需要clearInterval在销毁对象之前调用它。

于 2012-06-27T15:09:35.307 回答
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 回答