2015-04-26 87 views
3

這個問題可能微不足道,但我對我應該做的事情感到困惑。超時是否佔用內存?

基本上,我注意到,每個連續的超時我請具有較大ID號。我確信這只是爲了減少ID衝突,但我擔心即使超時已經執行,它仍然存在於內存中。

如果已執行超時功能,您是否需要調用任何「刪除」呢?在我的代碼中,我正在執行此操作:

clearTimeout(time);// destroy previous timer? 
time = setTimeout(function(){ hitup(towards);}, ms);// next execution 
+1

clearTimeout()僅用於阻止將來發生的事件。 –

+1

您需要9007199254740991超時以引起任何衝突。 –

回答

6

JavaScript引擎如何實現timerID值存儲完全取決於實現。他們可能使用某種映射或散列表,因爲這是一種像這樣的稀疏(非連續)值的經典存儲機制。

此前解僱或清除計時器不會仍然是主動或使用內存。你不需要調用任何東西來刪除定時器。

你的代碼表明:

clearTimeout(time);// destroy previous timer? 
time = setTimeout(function(){ hitup(towards);}, ms);// next execution 

有時還是有用的。如果您還不知道變量time中的計時器存儲是否已實際觸發並且您不希望它再次觸發,並且您將要覆蓋存儲其ID的變量,那麼有時候調用它是有意義的在這種情況下爲clearTimeout()。如果你知道計時器已經開火,或者你想讓它開火,那麼就不需要撥打clearTimeout()

系統將在這裏處理內存管理。這不是你必須擔心的事情。如果計時器尚未開啓,並且不希望計時器觸發,則只需要擔心停止計時器。

+0

謝謝,那正是我所希望的。所以在它被解僱後,它變得幾乎沒用了? – Andrew

+0

@ Lemony-Andrew - 是的,在'setTimeout()'已經觸發或用'clearTimeout()'手動停止之後,它會被系統清除。 – jfriend00

+0

對於setTimeout,您不需要使用'clearTimeout',它用於停止進一步的執行,基本上與'setInterval'一起使用,它在指定的時間間隔後重復執行。將內存管理放在'GC'上。 –

1

通常遊戲,如果超時功能執行,它和它的關閉將被刪除。 TimeoutID自動增量僅用於避免衝突。

但在某些情況下超時功能關閉,如果它使用somewere還能存在 - 例如,如果您創建另一個超時函數或事件處理或只作參考全局對象。

您不需要調用任何特殊的刪除功能。

0

如果你不使用任何東西的time變量不指定超時一個變量。

如果沒有指定的setTimeout給一個變量,你可以使用定時器無限期地不浪費內存,只要它們expirying。例如許多超時的超時會在內存過期之前使用內存。

+0

如果他們在一個匿名類中,並且如果使用相同的變量來捕獲每個連續的id,我認爲用於保存其id的內存將被垃圾收集。 – Andrew

+0

@ Lemony-Andrew正確。如果使用多個變量或數組來捕獲全局或原型/實例化對象中的超時,問題就會出現。 – dewd