JavaScript:析构函数或类似功能

4
我创建了一个非常方便处理时间间隔和作为动画帧使用的小对象,但它存在一个小问题。如果实例的引用丢失,时间间隔将继续运行。
function Interval(callback, interval){
    var timer = null;
    this.start = function(){
        if(!timer) timer = setInterval(callback, interval);
    };
    this.stop = function(){
        clearInterval(timer);
        timer = null;
    };
    this.changeSpeed = function(a){
        interval = a;
        this.stop();
        this.start();
    }
    this.destroy = function(){
        delete this;
    }
}

很明显,如果javascript没有破坏方法,我就无法跟踪何时停止间隔。因此,我认为我应该创建一个销毁方法,但我不确定是否可以从对象内部销毁实例。这是有道理的,但是……任何帮助将不胜感激!


4
问题是,为什么实例的引用会首先丢失,如果它确实丢失了,在这个destroy方法中你如何引用该实例? - adeneo
2
+1 给你的(假)照片...不行。 - DontVoteMeDown
3
假图片?真的吗?我的选票已经锁定了。 - PaulG
3
哇,@RakeshKR,这才是我所说的微小修改。 - Natan Streppel
1
@Streppel 你是什么意思?一个点会有很大的区别(就像一张图片)!哈哈 - DontVoteMeDown
显示剩余6条评论
1个回答

2
像这样做怎么样:

像这样做怎么样:

function Interval(callback, interval){
    var self = this;
    var timer = null;
    this.start = function(){
        if(!timer) timer = setInterval(function() {
            callback(self)
        }, interval);
    };
    this.stop = function(){
        clearInterval(timer);
        timer = null;
    };
    this.changeSpeed = function(a){
        interval = a;
        this.stop();
        this.start();
    }
    this.destroy = function(){
        this.stop();
    }
}

现在,当回调函数被调用时,它将传递一个对您的对象的引用,如果回调函数不再需要该对象,则回调函数至少有机会停止它。

这里的技巧是使用闭包来确保您可以在间隔到期时仍然引用该对象(因此使用了self变量)。

所以现在我可以做这样的事情:

var foo = new Interval(function(i) {
     // check if my interval is still needed
     if (dontNeedItAnymore) {
         i.destroy();        // or just .stop()
     }
     else {
         // do whatever
     }
}, 1000);

foo = null;       // whoops, lost the reference, but the callback will still be able to reference it

哦,现在我明白你的意思了。如果没有自动完成的方法,那么我想这就是它能达到的极限了。谢谢您先生! - php_nub_qq
@Bergi:那是我从原始帖子中复制粘贴的代码。 - Matt Burland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接