萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> 講解JavaScript內存的管理和釋放問題教程

講解JavaScript內存的管理和釋放問題教程

   一個內存釋放的實例

代碼如下   <SCRIPT LANGUAGE="JavaScript">
< !--
strTest = "1";
for ( var i = 0; i < 25; i ++ )
{
strTest += strTest;
}
alert(strTest);
delete strTest;
CollectGarbage();
//-->
< /SCRIPT>

  CollectGarbage,是IE的一個特有屬性,用於釋放內存的使用方法嘛應該是,將該變量或引用對象,設置為null或delete然後在進行釋放動作在做CollectGarbage前,要必需清楚的兩個必備條件:

  引用- 一個對象在其生存的上下文環境之外,即會失效。

  - 一個全局的對象在沒有被執用(引用)的情況下,即會失效。

代碼如下   //---------------------------------------------------------
// JavaScript對象何時失效
//---------------------------------------------------------
function testObject() {
var _obj1 = new Object();
}

function testObject2() {
var _obj2 = new Object();
return _obj2;
}

// 示例1
testObject();

// 示例2
testObject2()

// 示例3
var obj3 = testObject2();
obj3 = null;

// 示例4
var obj4 = testObject2();
var arr = [obj4];
obj3 = null;
arr = [];

  在這四個示例中:

  - “示例1”在函數testObject()中構造了_obj1,但是在函數退出時,它就已經離開了函數的上下文環境,因此_obj1失效了;

  - “示例2”中,testObject2()中也構造了一個對象_obj2並傳出,因此對象有了“函數外”的上下文環境(和生存周期),然而由於函數的返回值沒有被其它變量“持有”,因此_obj2也立即失效了;

  - “示例3”中,testObject2()構造的_obj2被外部的變量obj3持用了,這時,直到“obj3=null”這行代碼生效時,_obj2才會因為引用關系消失而失效。

  - 與示例3相同的原因,“示例4”中的_obj2會在“arr=[]”這行代碼之後才會失效。

  但是,對象的“失效”並不等會“釋放”。在JavaScript運行環境的內部,沒有任何方式來確切地告訴用戶“對象什麼時候會釋放”。這依賴於JavaScript的內存回收機制。——這種策略與.NET中的回收機制是類同的。

  在前面的Excel操作示例代碼中,對象的所有者,也就是"EXCEL.EXE"這個進程只能在“ActiveX Object實例的釋放”之後才會發生。而文件的鎖,以及操作系統的權限憑證是與進程相關的。因此如果對象僅是“失效”而不是“釋放”,那麼其它進程處理文件和引用操作系統的權限憑據時就會出問題。

  ——有些人說這是JavaScript或者COM機制的BUG。其實不是,這是OS、IE和JavaScript之間的一種復雜關系所導致的,而非獨立的問題。

  Microsoft公開了解決這種問題的策略:主動調用內存回收過程。

  在(微軟的)JScript中提供了一個CollectGarbage()過程(通常簡稱GC過程),GC過程用於清理當前IE中的“失效的對象失例”,也就是調用對象的析構過程。

  在上例中調用GC過程的代碼是:

代碼如下   //---------------------------------------------------------
// 處理ActiveX Object時,GC過程的標准調用方式
//---------------------------------------------------------
function writeXLS() {
//(略...)
copyright © 萬盛學電腦網 all rights reserved