WEB开发网
开发学院网页设计JavaScript 浏览器中的内存泄露(重新整理ing) 阅读

浏览器中的内存泄露(重新整理ing)

 2010-09-14 13:27:58 来源:WEB开发网   
核心提示: 而在IE7中,貌似为了改善内存泄露,浏览器中的内存泄露(重新整理ing)(4),IE7采用了极端的解决方案:离开页面时回收所有DOM树上的元素,其它一概不管,而这个对象一定会泄露,这个bug匪夷所思,但是这不仅没起到任何作用,反而使问题变得更加复杂

而在IE7中,貌似为了改善内存泄露,IE7采用了极端的解决方案:离开页面时回收所有DOM树上的元素,其它一概不管。但是这不仅没起到任何作用,反而使问题变得更加复杂。对这类问题,除了自觉一点绕开这些恶心的东西,多用innerHTML这种无用的建议之外。我想可以通过覆盖document.createElement来略为改善:

首先我们定义一个看不见的元素当作垃圾箱,所有新创建的元素都扔进垃圾箱里,这样保证了所有DOM元素都在DOM树上,IE7就可以正确回收了,另一方面也能避免所谓的"appendChild顺序不对导致内存泄露"。

function MemoryFix(){
  var garbageBox=document.createElement("div");
  garbageBox.style.display="none";
  document.body.appendChild(garbageBox);
  var createElement=document.createElement;
  document.createElement=function(){
    var obj=Function.prototype.apply.apply(createElement,[document,arguments]);
    garbageBox.appendChild(obj);
    return obj;
  }
}

3.    自动类型装箱转换

别不相信,下面的代码在ie系列中会导致内存泄露

var s=”lalala”;
alert(s.length);

s本身是一个string而非object,它没有length属性,所以当访问length时,JS引擎会自动创建一个临时String对象封装s,而这个对象一定会泄露。

这个bug匪夷所思,所幸解决起来相当容易,记得所有值类型做.运算之前先显式转换一下:

var s="lalala";
alert(new String(s).length);

上一页  1 2 3 4 

Tags:浏览器 内存 泄露

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接