簡體   English   中英

如何完全銷毀一個JavaScript對象?

[英]How to completely destroy a JavaScript object?

我正在使用node.js開發游戲服務器,我想將比賽存儲在隊列中,以便能夠在一定的超時后銷毀比賽。 這基本上是我的實現:

var matchs = [];

var createMatch = function () {
    matchs.unshift(new Match());
    matchs[0].start();

    setTimeout(function () {
        delete matchs[matchs.length - 1];
        matchs.pop();
    }, 5 * 1000);
};

function Match() {

    // ...

    this.foo = 0;

    this.start = function () {
        var self = this;

        setInterval(function () {
            console.log(self.foo++);
        }, 1 * 1000);
    };
}

這段代碼應該要做的是,當我調用createMatch() ,每秒顯示一個遞增的數字,並在5秒后停止。 但是,如果我運行此代碼,它將永遠永遠顯示數字,這使我認為我的Match對象未正確銷毀。

請幫助?

您可以使用clearInterval清理間隔。

var handle = setInterval(..);
clearInterval(handle);

簡單地延遲Match對象不會導致間隔停止,因為它仍在運行。 另外,該間隔將通過self變量保留對Match的引用。

delete運算符刪除屬性,但不破壞對象或對象已創建的任何事物(如間隔)。 因此,您的setTimeout實際上可能是:

setTimeout(function () {
    matchs.pop().destroy();
}, 5 * 1000);

pop從數組中刪除該元素(不再引用並且可以清除),但是需要destroy()才能明確告知Match對象它需要清除的內容。 在Javascript中,如果確實從內存中刪除了對象,則無法執行任何操作。 沒有這樣的概念。

因此,您的Match對象負責跟蹤事后需要清理的東西,例如下面的示例:

    function Match() {
    this.intervalId = undefined;

    this.start = function () {
        ...
        this.intervalId = setInterval(function () {
            ...
        }, 1 * 1000);
    };

    this.destroy = function() {
        if (intervalId)  {
            clearInterval(this.intervalId);
        }
    }
}

超時和間隔是可以由適當的功能破壞資源 在這種情況下, clearInterval()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM