更好地接近零化变量,javascript中的对象

时间:2011-11-29 11:47:42

标签: javascript javascript-events javascript-objects function-literal

我正在构建一些移动设备,并希望以某种方式清除,空对象,变量以释放一些内存。这里我有两个简单的例子,我认为这两个都是匿名函数但是哪种方式更好或更有效?对不起,如果我弄错了。对我来说,两者似乎做同样的事情,虽然我更喜欢第一个,因为在我需要它之前不会创建对象。第二个版本将立即执行用于创建变量,对象等的代码,但在我需要之前不执行主构建函数。

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

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" />

1 个答案:

答案 0 :(得分:2)

你不应该担心释放资源。 JavaScript有一个垃圾收集器,它将获取超出范围的变量并销毁它们。当您不需要使用delete obj.yourReferencereference = null或类似的东西时,删除对象的引用,让垃圾收集器完成剩下的工作。

如果删除a定义,您会发现#1会自动自动回收bapp.cleanup()变量本身。除非你这样做,ab都包含在你要留下的cleanup函数创建的闭包中,所以你要阻止垃圾收集器做这件事。

要摆脱#1中的整个app,您必须执行delete window.appapp = null,因为窗口会保留对它的引用。