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

时间:2013-10-17 01:35:32

标签: javascript memory memory-management memory-leaks

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

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

但是根据php - what's the benefit of unsetting variables?问题:

  

在运行时期间,取消设置变量实际上是否会减少内存消耗?    - 是的

我们应该delete window.some_var;吗?

或者我们应该使用some_var = null

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


UPD: 相关问题:

How to unset a Javascript variable?

How to remove a property from a javascript object

3 个答案:

答案 0 :(得分:3)

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

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

具体做法是:

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

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

  • “避免重复变量”

    再次 - 参考。将仍在null别处引用的内容设置为毫无意义。

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

在大多数其他未提及的情况下,引擎也非常智能,可以正确管理您的资料。不要过早优化。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

  

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

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

  

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

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

进一步阅读:What is JavaScript garbage collection?

相关问题