论坛首页 Web前端技术论坛

关于在JS里删除变量 销毁所占内存 的讨论

浏览 18812 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-13   最后修改:2011-04-18
如:
引用
var obj = document.getElementById(id);
obj = null;

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

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

那种销毁的内存多呢,
引用
我们的目标是:让内存不在增长
   发表时间:2011-04-13  
1、delete obj根本啥也没做,delete不是这么用的
2、设为null后没立刻销毁,要等待GC
3、出了作用域,不设null照样能GC

综上所述,一个都不用写
0 请登录后投票
   发表时间:2011-04-13  
对象都没有销毁呀,你要销毁document里面的元素,可以调用DOM的API,Node#removeChild(Node)
0 请登录后投票
   发表时间:2011-04-14  
int08h 写道
1、delete obj根本啥也没做,delete不是这么用的
2、设为null后没立刻销毁,要等待GC
3、出了作用域,不设null照样能GC

综上所述,一个都不用写

因为这个对象可能 要一直循环,所以要设置为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的时候,他会一直创建一个新的地址引用、
0 请登录后投票
   发表时间:2011-04-14  
mercyblitz 写道
对象都没有销毁呀,你要销毁document里面的元素,可以调用DOM的API,Node#removeChild(Node)

我不是要销毁这个元素,是销毁这个对象,让内存怎么设置不增长,因为这个对象要一直创建,也没说一定是页面元素,例如,还可以是:
var array = new Array();
等 呵呵
0 请登录后投票
   发表时间:2011-04-14   最后修改:2011-04-14
奥义之舞 写道
int08h 写道
1、delete obj根本啥也没做,delete不是这么用的
2、设为null后没立刻销毁,要等待GC
3、出了作用域,不设null照样能GC

综上所述,一个都不用写

因为这个对象可能 要一直循环,所以要设置为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引用被重新赋值,以前的数组没了引用,就会被GC(没出作用域也一样),设不设null没什么区别,你可以写个循环测试下时间。
引用
这一块array如果不设置为NUll的时候,他会一直创建一个新的地址引用

可以把array声明在循环外部,这样就一直是同一个引用。只是每次指向的是不同的对象了。
PS:js是函数级作用域,最好是把所有变量在函数开始就声明。
欢迎拍砖我的坦克游戏:http://www.iteye.com/topic/783537
0 请登录后投票
   发表时间:2011-04-14  
JS中,如果一个对象不能被访问到,那就会被GC回收。
通常是不用特意去把局部变量置null的

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

然后,IE还有一些比较恶心的问题,比如节点删除用removeNode会泄漏、IE Object leaks、一些特定的Dom节点必定会泄漏等等,还是建议发代码专门分析,
0 请登录后投票
   发表时间:2011-04-14  
delete obj 你确定可以生效?
0 请登录后投票
   发表时间:2011-04-14  
satanultra 写道
delete obj 你确定可以生效?

让他把那个var obj的var去掉就可以了
0 请登录后投票
   发表时间:2011-04-14  
JavaEye/ItEye
1号群 现招人 QQ 群号:39211996
女程序员群7736086
发完帖子我的号就没了,哎!
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics