`
奥义之舞
  • 浏览: 285352 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多
如:
引用
var obj = document.getElementById(id);
obj = null;

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

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

那种销毁的内存多呢,
引用
我们的目标是:让内存不在增长
分享到:
评论
27 楼 zxl10059 2011-04-18  
完全是画蛇添足,先去看完js的垃圾回收装置,变量作用域,内存的关系再来说
还有一些列子,完全是扯淡
26 楼 奥义之舞 2011-04-18  
aimicheng 写道
LZ患有内存泄漏焦虑症,鉴定完毕!

被逼的 beat it
25 楼 aimicheng 2011-04-18  
LZ患有内存泄漏焦虑症,鉴定完毕!
24 楼 奥义之舞 2011-04-16  
wmj007 写道
danny.chiu 写道
奥义之舞 写道
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



支持楼主这个理解,把变量定有放在循环外面,搞定

呵呵 本来就是这样做的、、
23 楼 wmj007 2011-04-16  
danny.chiu 写道
奥义之舞 写道
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



支持楼主这个理解,把变量定有放在循环外面,搞定
22 楼 奥义之舞 2011-04-15  
happysoul 写道
确实 多一个var 就区别了全局变量和内部变量 对JS还真不太清楚内部变量是如何决定回收机制的~~ 不过全局变量倒是肯定可以减少这种多余数据的创建

这句话其实很不正确、、

全局变量 用完之后 就销毁不了了, 如果是当做 一直的一个数据处理还行,另外 没写VAR的 ,直接默认的就是全局变量,而且可以删除,不比这个好么
21 楼 奥义之舞 2011-04-15  
zhengjie_dna 写道
createElement的时候还是要设 NULL不然gc 回收不了
其实到现在我还是没找到怎么去测试是否释放

这个我相信
20 楼 happysoul 2011-04-15  
确实 多一个var 就区别了全局变量和内部变量 对JS还真不太清楚内部变量是如何决定回收机制的~~ 不过全局变量倒是肯定可以减少这种多余数据的创建
19 楼 zhengjie_dna 2011-04-15  
createElement的时候还是要设 NULL不然gc 回收不了
其实到现在我还是没找到怎么去测试是否释放
18 楼 奥义之舞 2011-04-14  
int08h 写道
要相信js引擎,悲剧的都是DOM而不是js的内置对象
DOM就很难说了,天天出内存泄露,快麻木了

悲剧啊 到时候 画图天天要和dom打交道了
惨不忍睹
17 楼 int08h 2011-04-14  
要相信js引擎,悲剧的都是DOM而不是js的内置对象
DOM就很难说了,天天出内存泄露,快麻木了
16 楼 奥义之舞 2011-04-14  
int08h 写道
再次强调不需要设为null也不需要显式调用GC,如果内存增长太大就仔细检查自己所有的DOM操作,基本上只有DOM操作才有引发内存泄露的可能性

OK
15 楼 int08h 2011-04-14  
再次强调不需要设为null也不需要显式调用GC,如果内存增长太大就仔细检查自己所有的DOM操作,基本上只有DOM操作才有引发内存泄露的可能性
14 楼 奥义之舞 2011-04-14  
另外,那个IE下的CG函数可以释放多少内存啊,效率有多高,用了貌似没啥效果、
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, 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();
当然不是window级别的,是在for循环上面,方法里面!
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;
11 楼 jhcfe 2011-04-14  
个人觉得没有必要=null
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();
9 楼 纪红玉 2011-04-14  
JavaEye/ItEye
1号群 现招人 QQ 群号:39211996
女程序员群7736086
发完帖子我的号就没了,哎!
8 楼 EldonReturn 2011-04-14  
satanultra 写道
delete obj 你确定可以生效?

让他把那个var obj的var去掉就可以了

相关推荐

    内存变量检查 内存变量检测

    内存变量检查 内存变量检测 内存变量检查 内存变量检测 内存变量检查 内存变量检测内存变量检查 内存变量检测内存变量检查 内存变量检测

    易语言内存取变量数据地址

    综上所述,“易语言内存取变量数据地址”是易语言编程中的核心技能之一,涉及到内存地址获取、文本地址获取和内存数据的复制等操作。掌握这些技巧,能帮助开发者更好地理解和控制程序运行过程,实现更复杂的功能。

    php 变量引用与变量销毁机制详细介绍

    引用在垃圾回收中的处理,就是遵循这个逻辑,确保在删除引用时不会意外删除原始变量。 总的来说,PHP的变量引用机制有助于节省内存,特别是在处理大对象或大量数据时。同时,了解这一机制也有助于编写更高效且不...

    Objective-C中关于实例所占内存的大小详解

    "Objective-C中关于实例所占内存的大小详解" 本文主要介绍了Objective-C中实例所占内存的大小的相关知识点。文章通过示例代码详细地介绍了实例所占内存的大小的计算方法,并分析了实例所占内存的大小的原因。 首先...

    js动态引入外部js脚本并获取里面的变量值.pdf

    "js动态引入外部js脚本并获取里面的变量值"这个主题就是关于如何在JavaScript中实现这种功能的讨论。 首先,`jQuery`库提供了一个非常方便的方法来实现动态加载外部脚本:`$.getScript()`。这是一个异步方法,它...

    PHP中变量引用与变量销毁机制分析

    在PHP编程语言中,变量引用和变量销毁是两个关键的概念,它们直接影响到程序的性能和内存管理。本文将深入探讨这两个机制。 首先,我们来看PHP中的变量引用。在PHP中,使用`&`符号可以创建变量引用。不同于C语言中...

    全局变量、局部变量、静态变量即内存管理

    从分配内存空间看,全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量...

    php中用unset销毁变量并释放内存

    但是某些时候,用unset()却无法达到销毁变量占用的内存! 我们先看一个例子: &lt;?php $s = str_repeat('1',255); //产生由255个1组成的字符串 $m = memory_get_usage(); //获取当前占用内存 unset($s); $mm = ...

    指针变量、普通变量、内存和地址的全面对比

    1、a 表示一块内存空间2、&a 表示当前内存空间的地址那么指针变量就具有3种形态:1、a 表示指针a对应的内存空间2、&a 表示当前指针对应的内存空间的首地址3、*a 表示指针a所指向的变量对应的整个内存空间。...

    javascript变量作用域

    在上面的代码中,我们定义了一个全局变量 rain,并在 rainman 函数中调用 inner 函数, inner 函数中没有定义 rain 变量,因此 JavaScript 会继续查找 rainman 函数中的 rain 变量,如果 rainman 函数中也没有定义 ...

    JavaScript声明全局变量访问方法

    在JavaScript中,全局变量是一种可以在整个程序中任何地方访问的变量,它们的作用域跨越函数和代码块。本篇文章将深入探讨JavaScript声明全局变量的几种方法以及如何访问这些变量。 1. **全局变量的声明方式** - ...

    JavaScript全局变量的本质及页面共享问题 -页面

    JavaScript全局变量的本质与页面共享问题是一个重要的编程概念,尤其是在网页开发中。JavaScript是一种广泛使用的脚本语言,它的全局变量在程序中的角色独特,且与页面的生命周期和浏览器环境紧密相关。 首先,我们...

    DSP程序变量存储问题

    ### DSP程序变量存储问题详解 #### 一、引言 数字信号处理器(DSP)作为一种专门设计用于快速处理数字信号的微处理器,在音频处理、图像处理、通信等多个领域有着广泛的应用。DSP程序变量存储问题是开发人员在进行...

    js变量作用域

    在JavaScript中还存在一种特殊的现象,即在构造函数内部声明的变量,如果不使用`var`、`let`或`const`声明,则该变量会被认为是全局变量。但在某些情况下,这种行为似乎不符合预期,出现了一种被称为“神奇现象”的...

    Java中堆内存与栈内存分配浅析

    栈内存主要用于存储基本数据类型的变量、对象引用以及方法调用时所需的局部变量等。栈内存具有固定大小,因此在编译时即可确定其空间需求。栈内存的特点是先进后出(Last In First Out, LIFO),这意味着最后压入栈...

    C语言不同变量内存区域(堆,栈,代码区,全局区,BSS段)

    在C语言编程中,了解内存的分配方式以及变量在内存中的存储位置是非常重要的。这不仅有助于优化程序性能,还能防止因不当操作导致的内存泄漏或溢出问题。本篇文章将详细探讨C语言中变量所处的五种主要内存区域:堆、...

    JavaScript变量

    ### JavaScript变量详解 ...综上所述,理解JavaScript变量的命名规则、声明方式以及作用域等概念对于编写高质量的JavaScript代码至关重要。遵循这些最佳实践可以帮助开发者写出更加清晰、高效且易于维护的代码。

    CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

    这些变量仅在其定义的函数或语句块中有效,函数调用结束后,局部变量将被销毁,其所占内存被回收。 #### 静态全局变量 静态全局变量是在函数外部定义的,并且使用`static`关键字。尽管它仍然具有全局作用域,但其...

    全局变量、局部变量、静态全局变量、静态局部变量的区别

    一旦函数执行完毕,局部变量就会被销毁,释放其所占用的内存空间。局部变量的生命周期与其所在函数的执行周期一致,函数调用时创建,函数返回时销毁。 ### 静态全局变量(Static Global Variable) 静态全局变量是...

    vue 获取及修改store.js里的公共变量实例

    &lt;input type='text' :value='num'&gt; &lt;button @click='add'&gt;... // 因为要做修改 num 的值 所以放在 计算属性里 return this.$store.state.num } } store.js state: { num:0 }, mutations: { ad

Global site tag (gtag.js) - Google Analytics