只应删除属性

8
我在使用JSLint时遇到了这个错误:只应删除属性 为什么它不允许这样做呢?我试图删除的变量非常大,所以我希望能够加速垃圾回收。这样做不行吗?

3
你不能删除变量,只能删除对象属性。所以即使 var a = 5; delete a; 不会抛出错误(在 严格模式 下实际上会抛出错误),它也不会执行任何操作(delete a; 将返回 false)。所以:这是有效的代码,但它并不会做你想要的事情,只会让人感到困惑。 - Felix Kling
@FelixKling 不,事实并非如此。实际上,您可以使用delete运算符删除变量。您可以编写并运行测试代码。 var a=11; alert(delete a); alert(typeof a); 将会弹出true和"undefined"。 - cuixiping
3
@cuixiping Felix Kling是正确的。你不能使用delete删除(局部)变量。全局变量不同,因为它们实际上是附加到window对象的属性。 - NullUserException
哦,我同意我犯了一个错误。是的,你是对的。函数中的变量不能被删除。你可以将它设置为未定义。 - cuixiping
3个回答

12

delete 的作用是删除对象上的属性,而不是普通变量(变量对象上的属性)。

相反,你可以将所有引用值设置为 null。当 JavaScript 引擎感觉需要清理内存时,它会自动进行垃圾回收。


2

如果您只是想消除jslint的警告,可以尝试以下方法:

var myHugeVariable = ...;

// do stuff with huge variable

delete window.myHugeVariable;

这应该可以正常工作,因为所有全局变量实际上都是全局对象的属性。


本地变量怎么样?;) - Felix Kling
@FelixKling 很好的问题。我70%确定任何地方声明的所有变量都必须是某个对象的属性,只是需要弄清楚它们存在于哪个对象下。 - jbabey
普通变量是执行上下文的VariableObject属性,它在JavaScript API中没有公共接口。就我对规范的记忆来说,至少是这样的:P - alex
@alex我从未听说过VariableObject,你有没有任何好的链接可以解释它是如何工作的? - jbabey
1
@jbabey 这个链接看起来很有前途。 - alex

1
通常情况下,释放变量是不必要的。Javascript引擎会自动处理这些事情。
或者,您可以将变量设置为未定义,这样就可以通过jslint检查。
var a=11;
a = undefined;

不建议这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接