javascript - 为什么给DOM元素用attachEvent添加事件会引起内存泄露?
天蓬老师
天蓬老师 2017-04-11 12:49:25
[JavaScript讨论组]

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
PHP中文网

抱歉没怎么懂题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;  //释放
}
伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号