但LeakMemory卻會造成泄露。原因是LeakMemory()會先建立起parentDiv和childDiv之間的連接,這時(shí)候,為了讓 childDiv能夠獲知parentDiv的信息,因此IE需要先建立一個(gè)臨時(shí)的scope對象。而后parentDiv建立了和 hostElement對象的聯(lián)系,parentDiv和childDiv直接使用頁面document的scope。可惜的是,IE不會釋放剛才那個(gè)臨時(shí)的scope對象的內(nèi)存空間,直到我們跳轉(zhuǎn)頁面,這塊空間才能被釋放。而CleanMemory函數(shù)不同,他先把parentDiv和 hostElement建立聯(lián)系,而后再把childDiv和parentDiv建立聯(lián)系,這個(gè)過程不需要單獨(dú)建立臨時(shí)的scope,只要直接使用頁面 document的scope就可以了, 所以也就不會造成內(nèi)存泄露了。但是,需要特別說明一下,如果LeakMemory方法里面,創(chuàng)建的div對象上不綁定script事件,那么也不會有泄漏,這個(gè)可以理解為ie的bug,大家記住就可以了,不需要過分深究。其原理如下:
四、Pseudo-Leaks:
同樣可以理解為ie的bug的一種泄露:
<html> <head> <script language="JScript"> function LeakMemory() { // Do it a lot, look at Task Manager for memory response for(i = 0; i < 5000; i++) { hostElement.text = “function foo() { }”; } } </script> </head> <body> <button onclick=”LeakMemory()”>Memory Leaking Insert</button> <script id=”hostElement”>function foo() { }</script> </body> </html>
沒什么特別的好解釋,記住就可以了。
關(guān)于這四種泄漏的具體描述,還是請各位參照原文:http://msdn.microsoft.com/en-us/library/Bb250448
以上是幾種主要的泄露,當(dāng)然,除此之外,網(wǎng)上還有一些其他的討論,比如var str = "lalala";alert(str.length);這個(gè)簡單的語句也會造成內(nèi)存泄露,原因是類型轉(zhuǎn)換的時(shí)候,ie生成了一個(gè)臨時(shí)對象,這個(gè)臨時(shí)對象被泄漏了。類似情況還有很多,大家有興趣可以自己去搜集整理。
最后說一下,只要ie6還健在,作為前端開發(fā)人員,就不能逃避這些問題,當(dāng)然,也不必過分深究,比如閉包的情況就比較難避免,就像我一開始說的,畢竟,javascript造成的內(nèi)存泄露不是程序和項(xiàng)目的瓶頸,我們需要在各方面進(jìn)行權(quán)衡。
原文:http://www.aliued.cn/?p=2908
本文鏈接:http://m.95time.cn/tech/web/2010/7988.asp
出處:alibaba.com中國站
責(zé)任編輯:bluehearts
上一頁 GC與JS內(nèi)存泄露 [5] 下一頁
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|