日期:2014-05-16  浏览次数:20294 次

关于在JS里删除变量 销毁所占内存 的讨论
如:
引用
var obj = document.getElementById(id);
obj = null;

引用
var obj = document.getElementById(id);
delete obj;

引用
var obj = document.getElementById(id);
obj = null;
delete obj;

那种销毁的内存多呢,
引用
我们的目标是:让内存不在增长
8 楼 EldonReturn 2011-04-14  
satanultra 写道
delete obj 你确定可以生效?

让他把那个var obj的var去掉就可以了
9 楼 纪红玉 2011-04-14  
JavaEye/ItEye
1号群 现招人 QQ 群号:39211996
女程序员群7736086
发完帖子我的号就没了,哎!
10 楼 zuoming99 2011-04-14  
引用
因为这个对象可能 要一直循环,所以要设置为null啊,不然的话,循环一次JS 有创建了一个新的对象,
for (var i = 0; i < waveDataLength; i++) {
            array = waveData[i].split(",");
            point = 1 / array.length;
            for (var j = 0; j < array.length; j++) {
                num = i + Math.round((point * j) * 10) / 10;
                item = parseFloat(array[j]);
                dataArray.push([num, item]);
                num = null;item=null;
            }
            array = null;  item = null;  point = null;
        }

这一块array如果不设置为NUll的时候,他会一直创建一个新的地址引用、


array, item, point 这3个变量是声明在函数里的吗?只要不是window级变量,那么会函数在执行完成后,这些变量将会被GC收集掉。
像下面的代码不用担心内存回收问题:
function test(){
  var a = 123;
  a = [1,2,3];
  a = {1:1, 2:2, 3:3};
}
test();
11 楼 jhcfe 2011-04-14  
个人觉得没有必要=null
12 楼 奥义之舞 2011-04-14  
clue 写道
JS中,如果一个对象不能被访问到,那就会被GC回收。
通常是不用特意去把局部变量置null的

除非,有全局变量直接或间接引用(例如闭包引用了当前环境并被存储)、与Dom对象循环引用,这时就需要主动去断开引用,以便GC回收。

然后,IE还有一些比较恶心的问题,比如节点删除用removeNode会泄漏、IE Object leaks、一些特定的Dom节点必定会泄漏等等,还是建议发代码专门分析,

完整代码是这样的 确实是在上面声明的:
var dataArray = new Array();
        var array = null, point = null, num = null,item = null;
		var waveDataLength = waveData.length;
        for (var i = 0; i < waveDataLength; i++) {
            array = waveData[i].split(",");
            point = 1 / array.length;
            for (var j = 0; j < array.length; j++) {
                num = i + Math.round((point * j) * 10) / 10;
                item = parseFloat(array[j]);
                dataArray.push([num, item]);
                num = null;item=null;
            }
            array = null;  item = null;  point = null;
        }
        array = null;  item = null;  point = null; num = null; item=null;
13 楼 奥义之舞 2011-04-14  
zuoming99 写道
引用
因为这个对象可能 要一直循环,所以要设置为null啊,不然的话,循环一次JS 有创建了一个新的对象,
for (var i = 0; i < waveDataLength; i++) {
            array = waveData[i].split(",");
            point = 1 / array.length;
            for (var j = 0; j < array.length; j++) {
                num = i + Math.round((point * j) * 10) / 10;
                item = parseFloat(array[j]);
                dataArray.push([num, it