【问题标题】:Do we need to “unset” variables in JavaScript?我们需要在 JavaScript 中“取消设置”变量吗?
【发布时间】:2013-10-17 01:35:32
【问题描述】:

我们是否需要在 JavaScript 中取消设置变量,为什么?

例如在 PHP 中,建议在所有类型的循环中取消设置所有临时变量,以保持内存空闲并避免变量重复。

但无论如何根据php - what's the benefit of unsetting variables?问题:

取消设置变量是否真的不会减少运行时的内存消耗? -是的

那么我们应该delete window.some_var;吗?

或者我们应该使用some_var = null

或者我们不应该取消设置变量以避免额外的 CPU 周期?


更新: 相关问题:

How to unset a Javascript variable?

How to remove a property from a javascript object

【问题讨论】:

  • ECMAScript 中不能删除变量,只能删除没有标记为不删除的对象属性(即它们的[[Configurable]] 属性设置为false)。全局变量可作为全局(窗口)对象的属性使用,但如果它们是由声明(例如 var xfunction x)创建的,则它们是不可删除的。
  • @minitech — 我在 Firefox 中得到 function, function,IE 抛出错误“无法删除 window.hello”),你得到了什么?见ECMA-262 §10.5
  • @RobG:我在 Firefox 中得到 function, undefinedfunction, function 在 Chrome 中。 有趣。
  • @RobG:你指的是哪一部分?
  • 哦,Firefox 控制台包装了window 或其他东西。我的错。

标签: javascript memory memory-management memory-leaks


【解决方案1】:

不,另外在某些情况下,您不能删除全局范围内的变量。不能删除使用 var 关键字正确声明的变量(另一方面,可以删除隐含的全局变量。始终使用 var 关键字声明变量)。

此外,javascript 引擎有一个名为 garbage collector 的东西,它会在您的代码“运行”时自动查找不再使用或在某处引用的变量。一旦找到,它会立即将其推入深渊(删除内存中的变量)

【讨论】:

    【解决方案2】:

    不,当您完成变量时,没有必要删除它们。如果你有这么多巨大的全局变量,这实际上是一个问题,你需要重新考虑你的设计。

    是的,它在 PHP 中也很愚蠢,不,它与避免“额外的 CPU 周期”无关。

    具体来说:

    • “取消设置循环中的临时变量”

      它们是临时的,可能是 a) 整数或 b) 占用与整数一样多的空间的引用。不要打扰。

    • “避免重复变量”

      再次 - 参考。将仍然在其他地方引用的内容设置为 null 是没有意义的。

    如果您觉得它很混乱,这是一个好迹象,表明应该有更多的东西超出范围(即使用更多的功能)。

    在您没有提到的大多数其他情况下,引擎也足够聪明,可以正确管理您的东西。不要过早优化。

    【讨论】:

      【解决方案3】:

      David Flanagan 在他的书中很好地回答了这个问题,JavaScript: The Definitive Guide

      JavaScript 解释器执行自动垃圾收集以进行内存管理。这意味着程序可以根据需要创建对象,程序员永远不需要担心这些对象的破坏或释放。当一个对象不再可访问时——当程序不再有任何方法可以引用它时——解释器知道它永远不会被再次使用并自动回收它占用的内存。

      这并不意味着在 JavaScript 中不会发生内存泄漏。离得很远。 循环(或循环)引用是实现 reference counting 的浏览器中的常见问题,如 IBM 的 documented here

      当两个对象相互引用时形成循环引用,每个对象的引用计数为 1。在纯粹的垃圾回收系统中,循环引用不是问题:如果所涉及的对象都没有被任何其他对象引用对象,那么两者都被垃圾收集。然而,在引用计数系统中,两个对象都不能被销毁,因为引用计数永远不会达到零。在同时使用垃圾收集和引用计数的混合系统中,由于系统无法识别循环引用而发生泄漏。在这种情况下,DOM 对象和 JavaScript 对象都不会被销毁。清单 1 显示了 JavaScript 对象和 DOM 对象之间的循环引用。

      如果您担心自己的网站包含 JavaScript 内存泄漏,Google 有一个工具,名为“Leak Finder for JavaScript”,可以帮助您找到原因。

      延伸阅读:What is JavaScript garbage collection?

      【讨论】:

        猜你喜欢
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        相关资源
        最近更新 更多