删除JavaScript中不再使用的对象和变量是一种好的做法吗?

删除JavaScript中不再使用的对象和变量是一种好的做法吗?,javascript,Javascript,在我的代码中,我在函数中使用对象和变量。当在该函数中我不再使用对象和变量时,我将其删除: delete myObject; delete myVar; 这是个好习惯吗? 它有速度吗 我的JavaScript在smart.joyent.com上是服务器端的。通常认为这不是必需的,但在极端情况下,高内存可能是您应该研究的问题。我确实觉得在分析和性能测试之前使用它是过早的优化 一般认为这不是必要的,但在极端情况下,高记忆可能是您应该研究的问题。我确实觉得在分析和性能测试之前使用它是过早的优化 我不确

在我的代码中,我在函数中使用对象和变量。当在该函数中我不再使用对象和变量时,我将其删除:

delete myObject;
delete myVar;
这是个好习惯吗? 它有速度吗


我的JavaScript在smart.joyent.com上是服务器端的。

通常认为这不是必需的,但在极端情况下,高内存可能是您应该研究的问题。我确实觉得在分析和性能测试之前使用它是过早的优化

一般认为这不是必要的,但在极端情况下,高记忆可能是您应该研究的问题。我确实觉得在分析和性能测试之前使用它是过早的优化

我不确定您的服务器使用的是什么引擎,但客户端引擎通常采用垃圾收集,如果您的服务器环境也采用垃圾收集,我也不会感到惊讶。除非你有一个非常特殊的情况,否则大多数手工清理的尝试可能会与垃圾回收器相媲美。
总之,我敢打赌,你肯定看不到性能上的任何差异。这是一个很好的微优化示例。

我不确定您的服务器使用的是什么引擎,但客户端引擎通常采用垃圾收集,如果您的服务器环境也这样做,我也不会感到惊讶。除非你有一个非常特殊的情况,否则大多数手工清理的尝试可能会与垃圾回收器相媲美。 总之,我敢打赌,你肯定看不到性能上的任何差异。这是微观优化的一个很好的例子

这是个好习惯吗

不允许。事实上,新的ECMAScript第五版“严格模式”中不允许:

当delete运算符出现在严格模式代码中时,如果其UnaryExpression是对变量、函数参数或函数名的直接引用,则会抛出SyntaxError 11.4.1

如果您确实必须这样做,您可以改为=null该变量以释放它为垃圾收集引用的任何对象,但这几乎永远不会导致性能的任何明显改善

删除长寿命对象的属性以释放现在未使用的引用对象可能是一个好主意,尤其是在中断DOM周期以防止IE内存泄漏的情况下。删除短命函数中的局部变量是不明智的

这是个好习惯吗

不允许。事实上,新的ECMAScript第五版“严格模式”中不允许:

当delete运算符出现在严格模式代码中时,如果其UnaryExpression是对变量、函数参数或函数名的直接引用,则会抛出SyntaxError 11.4.1

如果您确实必须这样做,您可以改为=null该变量以释放它为垃圾收集引用的任何对象,但这几乎永远不会导致性能的任何明显改善


删除长寿命对象的属性以释放现在未使用的引用对象可能是一个好主意,尤其是在中断DOM周期以防止IE中内存泄漏的情况下。删除短命函数中的局部变量是不明智的。

,也可以不使用delete方法,Firefox 3似乎允许脚本通过以下方式调用垃圾收集器:

Components.utils.forceGC


其他浏览器也可能提供类似的功能。除了IE,我认为它没有提供。

而且Firefox 3似乎不使用delete方法,而是允许脚本通过以下方式调用垃圾收集器:

Components.utils.forceGC


其他浏览器也可能提供类似的功能。除了IE,我不认为它提供了什么。

你不能删除局部变量;严格模式ES5甚至会抛出一个语法错误,您不能删除局部变量;严格模式ES5甚至会抛出一个SyntaxErrorRexPlicity将局部变量设置为null可能很有用:因为朴素的JS实现是如何实现闭包的,所以它们保持较高作用域的所有变量都处于活动状态,而不仅仅是较低作用域中引用的变量—这只有在内部函数包含带有变量参数的eval时才有必要,很容易使变量看起来是短期不朽的:只需将函数文本分配给事件处理程序,在某些JS引擎中,只要事件处理程序存在,就无法收集函数中可见的变量。这与IE无法收集涉及DOM节点的循环引用相结合,你可以创建一个实际的漏洞,ie内存只有在你关闭浏览器实例时才会被重新引用显式地将局部变量设置为null可能会很有用:因为naive JS实现是如何实现闭包的,所以它们会使所有范围更大的变量保持活动状态,而且不仅仅是在较低的作用域中引用的变量——这只有在内部函数包含一个带有变量参数的eval时才有必要,很容易使看起来是短期不朽的变量:只是
将函数文本分配给事件处理程序,在某些JS引擎中,只要事件处理程序在附近,就无法收集函数中可见的变量。这与IE无法收集涉及DOM节点的循环引用相结合,你可以创建一个实际的泄漏ie内存只有在你关闭浏览器实例时才会被重新引用,如果仍然有一个对对象的实时引用,那么这是没有帮助的是,它不应该删除一个不在范围之外的对象引用。在Java中,垃圾收集器不会删除对象,除非它需要更多内存。我不知道mozilla、opera、ie、chrome是如何为Javascript设计垃圾收集器的。但情况也会类似。因此,与其删除,不如将对象设为null并调用垃圾回收器。如果仍然存在对该对象的活动引用,则这将无济于事。是的,它不应删除未超出范围的对象引用。在Java中,垃圾收集器不会删除对象,除非它需要更多内存。我不知道mozilla、opera、ie、chrome是如何为Javascript设计垃圾收集器的。但情况也会类似。因此,不要删除,而是将对象设为null并调用垃圾收集器。