摘要:之前的版本对对象和对象使用不同的垃圾回收例程对象采用引用计数收集策略,因此闭包在的这些版本中会导致一些特殊问题。但仅仅做到这一步,还是不能解决内存泄露问题。
IE9之前的版本对JScript对象和COM对象使用不同的垃圾回收例程(COM对象采用“引用计数”收集策略),因此闭包在IE的这些版本中会导致一些特殊问题。具体来说,如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素将无法被销毁。来看下面的例子:
function assignHandler() { var elem = document.getElementById("elem_id"); elem.onclick = function(evt) { alert(elem.id); }; }
以上代码创建了一个作为elem元素事件处理程序的闭包,而这个闭包则又创建了一个循环引用。由于匿名函数保存了一个对assignHandler()的活动对象的引用,因此就会导致无法减少elem的引用数。只要匿名函数存在,elem的引用数至少也是1,因此它所占用的内存就永远不会被回收。可以将上面的代码稍作修改一下就可以解决:
function assignHandler() { var elem = document.getElementById("elem_id"); var elem_id = elem.id; elem.onclick = function(evt) { alert(elem_id); }; elem = null; }
通过把elem.id的一个副本保存在一个变量中,并且在闭包中引用该变量消除了循环引用。但仅仅做到这一步,还是不能解决内存泄露问题。
“闭包会引用包含函数的整个活动对象,而其中就包含着elem。即使闭包不直接引用elem,包含函数的活动对象中也仍然会保存一个引用。因此,有必要把elem设置为null。这样就能解除对DOM对象的引用,顺利地减少其引用数,确保正常回收其占用的内存”
参考:JavaScript高级程序设计,JavaScript内存泄露教程,JavaScript内存泄露及分析
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94663.html
摘要:解决方式是,当我们不使用它们的时候,手动切断链接淘汰把和对象转为了真正的对象,避免了使用这种垃圾收集策略,消除了以下常见的内存泄漏的主要原因。以上参考资料高程垃圾收集类内存泄漏及如何避免内存泄露及解决方案详解类内存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...
摘要:中的变量是松散类型的即它在不同的时期可以有不同类型的值这也是最强大的的特性之一基本类型和引用类型的值的值类型有两种基本类型引用类型。 ECMAscript中的变量是松散类型的,即它在不同的时期可以有不同类型的值,这也是ECMAscript最强大的的特性之一. 基本类型和引用类型的值 javascript的值类型有两种:基本类型 引用类型。基本类型的值是指的简单的数据段,基本类型有五种,...
摘要:在客户端编程语言中,如和,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略还应该对一些特殊情况做处理,比如限制协议下脚本的访问权限。遍历循环循环方法用于调用数组的每个元素,并将元素传递给回调函数。 px、em和rem的区别 px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不会因为其他元素的尺寸变化而变化; em表示相对...
摘要:在客户端编程语言中,如和,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义。同源策略还应该对一些特殊情况做处理,比如限制协议下脚本的访问权限。遍历循环循环方法用于调用数组的每个元素,并将元素传递给回调函数。 px、em和rem的区别 px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不会因为其他元素的尺寸变化而变化; em表示相对...
阅读 882·2021-09-09 09:32
阅读 2767·2021-09-02 10:20
阅读 2630·2021-07-23 11:24
阅读 802·2019-08-30 15:54
阅读 3609·2019-08-30 15:54
阅读 1314·2019-08-30 11:02
阅读 2805·2019-08-26 17:40
阅读 1096·2019-08-26 13:55