3

Do we need to unset variables in JavaScript, and why?

For example in PHP it's recommended to unset all temporary variables in all kind of loops to keep memory free and avoid variables duplicates.

But anyways according to php - what's the benefit of unsetting variables? question:

Is it true that unsetting variables doesn't actually decrease the memory consumption during runtime? -Yep.

So should we delete window.some_var;?

Or we should use some_var = null?

Or we should not unset variables to avoid additional CPU cycles?


UPD: Related questions:

How to unset a Javascript variable?

How to remove a property from a javascript object

4

3 回答 3

3

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

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

具体来说:

  • “取消设置循环中的临时变量”</p>

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

  • “避免重复变量”</p>

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

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

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

于 2013-10-17T01:38:13.313 回答
3

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

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

于 2013-10-17T03:07:50.427 回答
1

David Flanagan 在他的《 JavaScript:权威指南》一书中很好地回答了这个问题:

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

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

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

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

进一步阅读:什么是 JavaScript 垃圾回收?

于 2013-11-01T13:48:22.643 回答