您的位置:首页 > 其它

如何优化网页的内存使用

2013-01-24 20:20 399 查看
  有时候设计的代码在实际运行中难免会遇到内存使用的问题,我们不可能在内存开始清理的时候才开始解决内存问题。内存的清理工作也是网站运行中比较烦人的东西,因为我们永远无法预知浏览器什么时候开始清理,清理时间有多长。

  所以,既然直接无法解决问题,我们就应该重点考虑如何避免内存问题。《高性能网站建设进阶指南》(这本书很不错,读过的人评价很高,如果你有时间,我建议你浏览下,肯定会受益匪浅)讲到了两种比较好的方式。

  一、使用delete从内存移除不再使用的js对象。

    一般是我在使用的过程中可能用一些变量存储了比较大的数据,但是使用完后就不再使用了,但是我可能忘记了这些变量,我在后面的程序过程中可能永远都不会再使用了。所以,最好的方式就是,当我意识到有这种情况发生时,就主动delete掉它,释放内存空间。

    如:delete tempVar;

    其实,这个delete还有个比较值得你使用的地方。我可以使用它来删除一个对象中一个属性。

    比如,我创建了一个存储用户阅读记录的对象,它里面包含了很多用户的阅读信息,但是记录条数应该是有限制的。那么,当总数达到最大值的时候,我就需要把最早阅读的记录删除掉,这时用delete viewHistory[itemID]就可以达到我的目的。

    当然,如果你用数组来存储序列,也可以使用delete来删除指定的item,但是要注意的是,删除后的数组索引并不会自动更新,而是出现隔断现象。

    如:var a=[1,2,3];

      delete a[1];

      a.join();

    你会发现最后在控制台中输出的结果是“1,,3”,很郁闷吧,所以遇到数组需要删除某个值的时候就不能直接delete某个item了。

    我的做法是:让后面(当然也可以使用前面的元素向后移动)的数组元素依次向前移动一个位置(后一个元素值“覆盖”前一个元素值),然后,pop数组(或者shift最前一个元素)最后一个元素。这样数组中的序列就被更新了。

  二、DOM树中移除不再是必须的节点。

    这个问题是我过去比较忽视的。

    一般遇到删除节点元素时,都是直接查找节点的父节点,然后调用removeChild方法来删除相应的节点(如果你使用的是Qwrap框架,你可以直接使用removeNode(targetNode))。

    如:targetNode.parent.removeChild(targetNode);

    好吧,最好的办法是:

    delete targetNode.parent.removeChild(targetNode);

  我也是第一次看这本书才发现,原来可以这么写。哇!这是洁癖么?

  如果你用得着,或者以后可能用得着,那么你就做个mark吧。

  PS:我还是想推荐文章开头提到的这本书,就如豆瓣上对它的书评:“尽管只读了两章,你会发现这真是一部难得的好书”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: