我的代码:
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和console log。
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 click = 4x控制台日志:(它创建了4个阴影对象。
答案 0 :(得分: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
。
答案 1 :(得分:0)
setInterval
返回计时器的标识符,然后可以通过clearInterval
来停止它。您需要在销毁对象之前调用clearInterval
。
答案 2 :(得分: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);
}