Home  >  Q&A  >  body text

javascript - 为什么给DOM元素用attachEvent添加事件会引起内存泄露?

据说是因为循环引用
但是这个attachEvent使用过程中具体怎么循环引用了呢?
求指教^_^

天蓬老师天蓬老师2654 days ago198

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-11 12:51:25

    抱歉没怎么懂题O(∩_∩)O~不过希望有帮助。
    IE的js对象和DOM对象使用不同的垃圾收集方法,因此闭包在IE中会导致内存泄露问题,也就是无法销毁驻留在内存中的元素。举个例子,需要去注销事件。

    function ready(fn){
        if(document.addEventListener) {        //标准浏览器
            document.addEventListener('DOMContentLoaded', function() {
                //注销事件, 避免反复触发
                document.removeEventListener('DOMContentLoaded',arguments.callee, false);
                fn();            //执行函数
            }, false);
        }else if(document.attachEvent) {        //IE
            document.attachEvent('onreadystatechange', function() {
                if(document.readyState == 'complete') {
                    document.detachEvent('onreadystatechange', arguments.callee);
                    fn();        //函数执行
                }
            });
        }
    };
    

    或者在引用DOM时对其释放,解除引用避免内存泄露。这里涉及到的内存泄露以及闭包等问题可参考我的文章,互相学习,共同进步。

    function fn(){
        var oId = document.getElementById('id');
        var html = op.innerHTML;
        oId.onclick = function () {
            console.log(html);
        };
        oId = null;  //释放
    }
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 12:51:25

    因为ie下的垃圾回收机制,它采用的是引用计数,当a引用b而b又引用a时,内存就不会被回收。

    reply
    0
  • Cancelreply