您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

详谈JavaScript内存泄漏_javascript技巧

2026/1/11 19:13:47发布18次查看
1、什么是闭包、以及闭包所涉及的作用域链这里就不说了。
2、javascript垃圾回收机制
     javascript不需要手动地释放内存,它使用一种自动垃圾回收机制(garbage collection)。当一个对象无用的时候,即程序中无变量引用这个对象时,就会从内存中释放掉这个变量。
复制代码 代码如下:
var s = [ 1, 2 ,3];
    var s = null;
    //这样原始的数组[1 ,2 ,3]就会被释放掉了。
3、循环引用
     三个对象 a 、b 、c
     aàbàc :a的某一属性引用着b,同样c也被b的属性引用着。如果将a清除,那么b、c也被释放。
     aàbàcàb :这里增加了c的某一属性引用b对象,如果这是清除a,那么b、c不会被释放,因为b和c之间产生了循环引用。
复制代码 代码如下:
var a = {};
    a.pro = { a:100 };
    a.pro.pro = { b:100 };
    a = null ;
    //这种情况下,{a:100}和{b:100}就同时也被释放了。
var obj = {};
    obj.pro = { a : 100 };
    obj.pro.pro = { b : 200 };
    var two = obj.pro.pro;
    obj = null;   
    //这种情况下 {b:200}不会被释放掉,而{a:100}被释放了。
4、循环引用和闭包
复制代码 代码如下:
function outer(){
        var obj = {};
        function inner(){
            //这里引用了obj对象
        }
        obj.inner = inner;
    }
这是一种及其隐蔽的循环引用,。当调用一次outer时,就会在其内部创建obj和inner两个对象,obj的inner属性引用了inner;同样inner也引用了obj,这是因为obj仍然在innerfun的封闭环境中,准确的讲这是由于javascript特有的“作用域链”。
因此,闭包非常容易创建循环引用,幸运的是javascript能够很好的处理这种循环引用。
5、ie中的内存泄漏
    ie中的内存泄漏有好几种,这里有详细的解释(http://msdn.microsoft.com/en-us/library/bb250448.aspx)。
    这里只讨论其中一种,即循环引用所造成的内存泄漏,因为,这是一种最普遍的情况。
    当在dom元素或一个activex对象与普通javascript对象之间存在循环引用时,ie在释放这类变量时存在特殊的困难,最好手动切断循环引用,这个bug在ie 7中已经被修复了(http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html)。
   “ie 6 suffered from memory leaks when a circular reference between several objects, among which at least one dom node, was created. this problem has been solved in ie 7. ”
    如果上面的例子(第4点)中obj引用的不是一个javascript function对象(inner),而是一个activex对象或dom元素,这样在ie中所形成的循环引用无法得到释放。
复制代码 代码如下:
function init(){
        var elem = document.getelementbyid( 'id' );
        elem.onclick = function(){
            alert('rain-man');
            //这里引用了elem元素
        };
    }
elem引用了它的click事件的监听函数,同样该函数通过其作用域链也引用回了elem元素。这样在ie中即使离开当前页面也不会释放这些循环引用。
6、解决方法
   基本的方法就是手动清除这种循环引用,下面一个十分简单的例子,实际应用时可以自己构建一个addevent()函数,并且在window的unload事件上对所有事件绑定进行清除。
复制代码 代码如下:
function outer(){
        var one = document.getelementbyid( 'one' );
        one.onclick = function(){};
    }
    window.onunload = function(){
        var one = document.getelementbyid( 'one' );
        one.onclick = null;
    };
其它方法(by:douglas crockford)
复制代码 代码如下:
/**
 * 遍历某一元素节点及其所有后代元素
 *
 * @param elem node  所要清除的元素节点
 * @param function func  进行处理的函数
 *
 */
function walkthedom(node, func) {
    func(node);
    node = node.firstchild;
    while (node) {
        walkthedom(node, func);
        node = node.nextsibling;
    }
}
/**
 * 清除dom节点的所有引用,防止内存泄露
 *
 * @param elem node  所要清除的元素节点
 *
 */
function purgeeventhandlers(node) {
    walkthedom(node, function (e) {
        for (var n in e) {           
            if (typeof e[n] ===
                    'function') {
                e[n] = null;
            }
        }
    });
以上就是javascript内存泄漏的相关内容以及解决方案了,有需要的小伙伴可以参考下
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product