【问题标题】:Does a timeout take up memory?超时会占用内存吗?
【发布时间】:2015-04-26 17:19:10
【问题描述】:

这个问题可能是微不足道的,但我对我应该做什么感到困惑。

基本上,我注意到我调用的每个连续超时都有一个更大的 ID 号。我确定这只是为了减少ID冲突,但我担心即使超时已经执行,它仍然存在于内存中。

如果一个超时函数已经执行,你需要调用什么来“删除”吗?在我的代码中,我正在这样做:

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

【问题讨论】:

  • clearTimeout() 仅用于阻止事件在未来发生。
  • 你需要 9007199254740991 超时才能引起任何冲突。

标签: javascript memory settimeout


【解决方案1】:

Javascript 引擎如何实现 timerID 值存储完全取决于实现。他们可能使用某种映射或哈希表,因为这是存储此类稀疏(非顺序)值的经典存储机制。

之前触发或清除的计时器将不再处于活动状态或使用内存。你不需要调用任何东西来删除计时器。

你展示的代码:

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

有时仍然有用。如果您还不知道变量 time 中的计时器存储是否已实际触发并且您不希望它再触发并且您即将覆盖存储其 ID 的变量,那么它有时确实有意义在这种情况下打电话给clearTimeout()。如果您知道计时器已触发或者您希望它触发,则无需调用clearTimeout()

系统将在此处处理内存管理。这不是你必须担心的事情。如果计时器尚未触发并且您不希望它在预定时间触发,您只需要担心它会停止。

【讨论】:

  • 谢谢,这正是我所希望的。所以在它被触发后它变得几乎没用了?
  • @Lemony-Andrew - 是的,在setTimeout() 被触发或使用clearTimeout() 手动停止后,系统会清理它。
  • setTimeout 不需要使用clearTimeout,它用于停止进一步执行,基本上与setInterval 一起使用,在指定的时间间隔后重复执行。将内存管理留在GC
【解决方案2】:

通常如果超时函数执行,它和它的闭包将被删除。 TimeoutID 自动增量仅用于避免冲突。

但在某些情况下,超时函数的关闭可能存在,如果它使用了其他东西 - 例如,如果您创建另一个超时函数或事件处理程序,或者只是引用全局对象。

您不需要调用任何特殊的删除函数。

【讨论】:

    【解决方案3】:

    如果您没有将time 变量用于任何事情,请不要将超时分配给变量。

    如果您不将 setTimeout 分配给变量,则可以无限期地使用计时器而不会浪费内存,前提是它们即将到期。例如许多长时间的超时将使用内存直到它们过期。

    【讨论】:

    • 如果他们在一个匿名类中,并且如果使用相同的变量来捕获每个连续的 id,我认为用于保存他们的 id 的内存将被垃圾收集。
    • @Lemony-Andrew 正确。问题是如果您使用多个变量或数组来捕获全局或原型/实例化对象中的超时。
    猜你喜欢
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2023-04-09
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多