更好的方法在Javascript中清空变量和对象

Better approach nulling variables, objects in Javascript

本文关键字:清空 变量 对象 Javascript 方法 更好      更新时间:2023-09-26

我正在为移动设备构建一些东西,并希望以某种方式清除,空对象,变量来释放一点内存。这里我有两个简短的例子,我相信都是匿名函数,但哪种方法更好或更有效?如果我说错了,很抱歉。对我来说,两者似乎都做同样的事情,虽然我更喜欢第一个对象不会被创建,直到我需要它。第二个版本将立即执行代码创建变量,对象等,但不做主要的构建功能,直到我需要它。

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

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或event后面

<input type="button" onclick="app.cleanup()" value="clean" />

您不应该担心释放资源。JavaScript有一个垃圾收集器,它会捡起超出作用域的变量并销毁它们。当您使用delete obj.yourReferencereference = null或类似的方法不需要某个对象时,删除该对象的引用,让垃圾收集器完成其余的工作。

您会发现#1将自动收回ab变量本身,如果您删除您的app.cleanup()定义。除非您这样做,否则ab都包含在您留下的cleanup函数创建的闭包中,因此您正在阻止垃圾收集器做它的事情。

要去掉#1中的整个app,你必须做delete window.appapp = null,因为窗口保存了对它的引用