在Javascript中为变量和对象设置空值的更好方法
我正在为移动设备构建一些东西,并希望以某种方式清除空对象、变量以释放一点内存。这里我有两个简单的例子,我相信这两个都是匿名函数,但什么方法更好或更有效呢?对不起,如果我完全弄错了。对我来说,两者似乎都做了同样的事情,尽管我更喜欢第一件,因为只有在我需要的时候才会创建对象。第二个版本将立即执行创建变量、对象等的代码,但在需要之前不执行主构建函数 我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用 V1在Javascript中为变量和对象设置空值的更好方法,javascript,javascript-objects,dom-events,function-literal,Javascript,Javascript Objects,Dom Events,Function Literal,我正在为移动设备构建一些东西,并希望以某种方式清除空对象、变量以释放一点内存。这里我有两个简单的例子,我相信这两个都是匿名函数,但什么方法更好或更有效呢?对不起,如果我完全弄错了。对我来说,两者似乎都做了同样的事情,尽管我更喜欢第一件,因为只有在我需要的时候才会创建对象。第二个版本将立即执行创建变量、对象等的代码,但在需要之前不执行主构建函数 我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用 V1 var app = function() { //c
var app = function() {
//create variables, objects
var a = 'Data 1';
var b = 'Data 2';
//do some things
console.log(a + ', ' + b);
//do a cleanup
app.cleanup = function() {
a = null;
b = null;
console.log(a, b);
}
}
setTimeout(app, 200);
V2
var app = {};
(function(){
//create variables, objects
var a = 'Data 1';
var b = 'Data 2';
app.build = function(){
//do some things
console.log(a + ', ' + b);
}
//do a cleanup
app.cleanup = function(){
a = null;
b = null;
console.log(a, b);
}
setTimeout(app.build,200);
})();
稍后在html或事件中
<input type="button" onclick="app.cleanup()" value="clean" />
您不应该担心释放资源。JavaScript有一个垃圾收集器,它将拾取超出范围的变量并销毁它们。使用Delete obj.yourReference
、reference=null
或类似方法删除对对象的引用,然后让垃圾回收器完成其余工作
如果删除app.cleanup()
定义,您会发现#1将自动回收a
和b
变量本身。除非您这样做,a
和b
都包含在由您留下的cleanup
函数创建的闭包中,因此您正在阻止垃圾收集器执行它的操作
要摆脱#1中的整个
app
,您必须执行delete window.app
或app=null
,因为window包含对它的引用。您不应该担心释放资源。JavaScript有一个垃圾收集器,它将拾取超出范围的变量并销毁它们。当你不需要某个对象时,删除它的引用(Delete obj.yourReference
,/reference=null
/reference=undefined
),让垃圾收集器来完成其余的工作。但是要删除引用或null,你会选择我的V1或V2吗?我的意思是,我仍然需要在某个地方这样做。或者简化@Matt所说的:如果变量变得不可用(没有其他方法能够以任何方式访问它),它将被标记为垃圾收集。基本上,如果在函数中创建了变量(局部变量,如您的情况),那么在函数结束后,没有人能够访问它,因此它将被自动清理。您应该知道,实际上,您没有清理任何东西。JavaScript中的字符串是不可变的。文字“data1”和“data2”已经是程序的一部分,因此a和b只指向那些已经存在的字符串。将它们设置为null只会删除对这些字符串的一个引用。@Alex:目前,#1不需要任何清理。删除你的app.cleanup()。