在Javascript中为变量和对象设置空值的更好方法

在Javascript中为变量和对象设置空值的更好方法,javascript,javascript-objects,dom-events,function-literal,Javascript,Javascript Objects,Dom Events,Function Literal,我正在为移动设备构建一些东西,并希望以某种方式清除空对象、变量以释放一点内存。这里我有两个简单的例子,我相信这两个都是匿名函数,但什么方法更好或更有效呢?对不起,如果我完全弄错了。对我来说,两者似乎都做了同样的事情,尽管我更喜欢第一件,因为只有在我需要的时候才会创建对象。第二个版本将立即执行创建变量、对象等的代码,但在需要之前不执行主构建函数 我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用 V1 var app = function() { //c

我正在为移动设备构建一些东西,并希望以某种方式清除空对象、变量以释放一点内存。这里我有两个简单的例子,我相信这两个都是匿名函数,但什么方法更好或更有效呢?对不起,如果我完全弄错了。对我来说,两者似乎都做了同样的事情,尽管我更喜欢第一件,因为只有在我需要的时候才会创建对象。第二个版本将立即执行创建变量、对象等的代码,但在需要之前不执行主构建函数

我只是想弄清楚哪种方式更常见。我知道像我这样的初学者大多误解了匿名函数的使用

V1

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()。