我们是否需要在 JavaScript 中“取消设置”变量?

Do we need to “unset” variables in JavaScript?

本文关键字:设置 取消 取消设置 变量 是否 JavaScript 我们      更新时间:2023-09-26

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

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

但无论如何,根据 php - 取消设置变量有什么好处? 问题:

取消设置变量实际上不会减少运行时的内存消耗,这是真的吗? -是的

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

或者我们应该使用some_var = null

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


上级:相关问题:

如何取消设置Javascript变量?

如何从 JavaScript 对象中删除属性

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

此外,javascript引擎有一个名为垃圾收集器的东西,当你的代码"运行"时,它会自动查找不再使用或引用的变量。一旦找到一个,它会立即将其推入深渊(删除内存中的变量)

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

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

具体说来:

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

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

  • "避免重复变量"

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

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

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

David Flanagan在他的书《JavaScript: The Definitive Guide》中很好地回答了这一点:

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

这并不意味着 JavaScript 中不会发生内存泄漏。远非如此。循环(或循环)引用是实现引用计数的浏览器中的常见问题,如 IBM 在此处所述:

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

如果你担心你的网站包含JavaScript内存泄漏,谷歌有一个工具,恰如其分地命名为"JavaScript泄漏查找器",可以帮助你找到原因。

延伸阅读:什么是 JavaScript 垃圾回收?