JacaScript 闭包(四)内存泄漏

由于IE9之前的版本对JScript对象和COM对象使用不同的垃圾收集例程,因此闭包在IE这些版本中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素将无法被销毁。

function assignHandler() {
var element = document.getElementById("someElement");

element.onClick = function() {
alert(element.id);
}
}

上例代码创建了一个 element 元素时间处理程序的闭包,而这个闭包则又创建了一个循环引用。由于匿名函数保存了一个对 assignHandler() 的活动对象的引用,因此就会导致无法减少 element 的引用次数。只要匿名函数存在, element 的引用数至少也是1,因此它所占用的内存永远不会被回收。不过,这个问题可以通过稍微改写一些代码来解决。

function assignHandler() {
var element = document.getElementById("someElement");
var id = element.id;

element.onClick = function() {
alert(id);
}

element = null
}

在上面的代码中,通过把 element.id 的一个副本保存在一个变量中,并且在闭包中引用该变量消除了循环引用。但仅仅做到这一步,还是不能解决内存泄漏问题。

闭包会引用函数的整个活动对象,而其中包含着 element 。即使闭包不直接引用 element,包含函数的活动对象中也仍然会保存一个引用。

把 element 变量设置为 null,这样就能够解除对DOM对象的引用,村里的减少其引用次数,确保正常回收其占用的内存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义函数的方式有两种:函数声明和函数表达式。 函数声明的一个重要特征就是函数声明提升,意思是在执行代码前会先读取函...
    oWSQo阅读 3,892评论 0 0
  • 我很爱和女儿一起看 TED 演讲。我们总在睡前看一段,次日上学路上再对所看内容进行交流。我知道在看 TED、聊 T...
    ElfeXu阅读 4,957评论 0 0
  • 十四行记录日常,记录我平淡一天中些许的bright point.Here is for today. 你知道我抽烟...
    sH2nxy阅读 2,622评论 0 1
  • 回到家以后觉得很累,晚饭也没吃躺在床上就想睡觉。后来,还是给好友发了微信,发发牢骚,告诉她一些近况。她没回,我也就...
    拉卡罗拉阅读 2,920评论 0 0
  • 谢谢你在人海中 导语:趁阳光正好,趁微风不噪,去拥抱你爱的人吧。 那片笑声让我想起我的那些花儿,在我生命每个角落...
    榕树下的星星阅读 4,026评论 2 1